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

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/

10-14 17:24
查看更多