4

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

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

//or

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

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

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

2 回答 2

1

Scala 风格指南建议:

充当任何类型的访问器(封装字段或逻辑属性)的方法应该在没有括号的情况下声明,除非它们有副作用。

除了访问器之外,它没有提到任何其他用例。所以问题归结为您是否将此方法视为访问器,这又取决于类的其余部分是如何设置的,也许还取决于(预期的)调用站点。

于 2013-10-06T13:39:32.967 回答
1

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


第一:有关的案例var是一个有趣的案例。声明 avar foo会给你一个foo 不带括号的吸气剂。显然这是一个不纯的调用,但它没有副作用(它不会改变调用者未观察到的任何内容)。

其次,关于您的问题:我现在不认为问题getRemoteSessionId在于它是不纯的,而是它实际上使服务器为您维护一些会话登录,因此显然您对环境造成了破坏性的干扰。然后method3()应该用括号写,因为这种副作用性质。

第三个例子:获取目录的内容因此应该被写入file.children而不是file.children(),因为这又是一个不纯的函数但不应该有副作用(除了可能对你的文件系统的只读访问)。

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

使用第四种情况,我的暂定答案是:当函数有副作用时,最好使用括号;或者如果它不纯并且取决于不受您的程序控制的状态。

有了这个定义,是否getRemoteSessionId知道副作用并不重要。另一方面,它意味着恢复写作file.children()......

于 2013-10-06T15:42:54.803 回答