究竟有什么区别:
scala> def foo = 5
foo: Int
Run Code Online (Sandbox Code Playgroud)
和
scala> def foo() = 5
foo: ()Int
Run Code Online (Sandbox Code Playgroud)
似乎在这两种情况下,我最终得到一个变量foo,我可以在没有括号的情况下参考,总是评估5.
Dav*_*ith 17
在任何一种情况下,您都没有定义变量.你正在定义一个方法.第一种方法没有参数列表,第二种方法有一个参数列表,它是空的.第一个应该像这样调用
val x = foo
Run Code Online (Sandbox Code Playgroud)
而第二个应该像这样调用
val x = foo()
Run Code Online (Sandbox Code Playgroud)
但是,Scala编译器将允许您使用一个没有括号的空参数列表调用方法,因此任何一种调用形式都适用于第二种方法.不能使用括号调用不带参数列表的方法
首选的Scala样式是定义和调用与括号有副作用的无参数方法.没有副作用的无参数方法应该在没有括号的情况下定义和调用.
如果你实际上定义了一个变量,那么语法是
val foo = 5
Run Code Online (Sandbox Code Playgroud)
在说出其他任何内容之前,def没有定义字段,它定义了一个方法.
在第二种情况下,由于Scala的特定功能,您可以省略括号.这里有两个不同的区别:一个是机械的,一个是推荐的用法.
从后者开始,建议在有副作用时使用空参数列表.一个典型的例子是close().如果调用元素没有副作用,则省略括号.
现在,作为一个实际的区别 - 除了在角落案件中可能奇怪的句法混淆(我不是说有,只是推测) - 结构类型必须遵循正确的约定.
例如,Source有一个close没有括号的方法,意味着结构类型def close(): Unit不接受Source.同样,如果我将结构方法定义为def close: Unit,closeable则不接受Java 对象.