当我使用def在Scala中定义字段时,这意味着什么?

lin*_*lof 7 scala

究竟有什么区别:

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)

  • 实际上,Scala会让你忽略任意数量的(尾随)空参数列表!试试`def x()()()()()()()= 5`! (5认同)

Dan*_*ral 6

在说出其他任何内容之前,def没有定义字段,它定义了一个方法.

在第二种情况下,由于Scala的特定功能,您可以省略括号.这里有两个不同的区别:一个是机械的,一个是推荐的用法.

从后者开始,建议在有副作用时使用空参数列表.一个典型的例子是close().如果调用元素没有副作用,则省略括号.

现在,作为一个实际的区别 - 除了在角落案件中可能奇怪的句法混淆(我不是说有,只是推测) - 结构类型必须遵循正确的约定.

例如,Source有一个close没有括号的方法,意味着结构类型def close(): Unit不接受Source.同样,如果我将结构方法定义为def close: Unit,closeable则不接受Java 对象.