scala – 非纯函数的括号

我知道如果方法有副作用,我应该按惯例使用()

def method1(a: String): Unit = {
  //.....
}

//or

def method2(): Unit = {
  //.....
}

如果一个方法没有副作用但是它不是纯粹的,没有任何参数,当然,每次调用它时会返回不同的结果,我是否必须做同样的事情?

def method3() = getRemoteSessionId("login", "password")

最佳答案 编辑:在回顾了Luigi Plinge的评论之后,我开始认为我应该重写答案.这也不是一个明确的是/否答案,而是一些建议.

第一:关于var的案例很有意思.声明一个var foo会给你一个没有括号的getter foo.显然这是一个不纯的调用,但它没有副作用(它不会改变调用者未观察到的任何内容).

第二,关于你的问题:我现在不会争辩说getRemoteSessionId的问题在于它是不纯的,但实际上它让服务器为你维护一些会话登录,所以很明显你会破坏性地干扰环境.然后,由于这种副作用,应该用括号写出method3().

第三个例子:获取目录的内容因此应该写成file.children而不是file.children(),因为它再次是一个不纯的函数,但不应该有副作用(除了对文件的只读访问权限)系统).

第四个例子:鉴于上述情况,您应该编写System.currentTimeMillis.我确实倾向于编写System.currentTimeMillis()但是…

使用这个案例,我的初步答案是:当函数具有副作用时,括号是更可取的;或者它是不纯的,取决于不受您的计划控制的州.

根据这个定义,getRemoteSessionId是否具有已知的副作用并不重要.另一方面,它意味着要恢复写file.children()……

点赞