我知道如果一个方法有副作用,我应该按照惯例使用 ()
def method1(a: String): Unit = {
//.....
}
//or
def method2(): Unit = {
//.....
}
如果一个方法没有副作用但它不纯,没有任何参数,当然,它每次被调用时都会返回不同的结果,我是否必须做同样的事情?
def method3() = getRemoteSessionId("login", "password")
最佳答案
编辑: 在查看 Luigi Plinge 的评论后,我开始认为我应该重写答案。这也不是一个明确的是/否答案,而是一些建议。
第一:关于 var
的案例是一个有趣的案例。声明一个 var foo
会给你一个没有括号的 getter foo
。显然这是一个不纯的调用,但它没有副作用(它不会改变调用者未观察到的任何东西)。
其次,关于您的问题:我现在不会争辩说 getRemoteSessionId
的问题在于它不纯,但它实际上使服务器为您维护了一些 session 登录,因此很明显您对环境造成了破坏性干扰。然后 method3()
应该用括号编写,因为这种副作用性质。
第三个例子:因此,获取目录的内容应该写为 file.children
而不是 file.children()
,因为它也是一个不纯的函数,但不应该有副作用(除了对文件系统的只读访问)。
第四个示例:鉴于上述情况,您应该编写 System.currentTimeMillis
。我确实倾向于编写 System.currentTimeMillis()
但是...
使用第四种情况,我的初步答案是: 当函数有副作用时,最好使用括号;或者它是否不纯并且取决于不受程序控制的状态。
有了这个定义,getRemoteSessionId
是否有已知的副作用就无关紧要了。另一方面,它意味着恢复编写 file.children()
...
关于scala - 非纯函数的括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19208420/