Scala 不带args的def

Scala 不带args的def,scala,function,Scala,Function,如果我创建一个函数: def a(): String = return "some string" 结果将是“a:()字符串” 所以我可以使用括号/不使用括号 另一方面,如果我创建相同的函数 def a:String = return "some other string" 那只是“a:字符串” 在这种情况下,我不能用括号 这两者之间有什么区别?如果这样定义a,没有括号(注意,return关键字不是必需的): 然后用括号调用它:a(),那么()不是方法a的空参数列表;相反,Scala将尝试将

如果我创建一个函数:

def a(): String = return "some string"
结果将是“a:()字符串” 所以我可以使用括号/不使用括号

另一方面,如果我创建相同的函数

def a:String = return "some other string"
那只是“a:字符串” 在这种情况下,我不能用括号


这两者之间有什么区别?

如果这样定义
a
,没有括号(注意,
return
关键字不是必需的):

然后用括号调用它:
a()
,那么
()
不是方法
a
的空参数列表;相反,Scala将尝试将
()
应用于方法
a
返回的字符串。尝试此操作时收到的错误消息提示:

scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       a()
        ^

良好实践建议定义没有
()
而没有副作用的函数,并在函数有副作用时(例如,
println()
而不是
println
)在定义站点和调用站点添加
)。

注意:您可以在Scala中省略
return
关键字,方法的结果是方法中最后一个表达式的值。也可以避免指定def type。我只是想指出它是一个函数,所以每个人都会马上看到它=),但它不是一个函数,而是一个方法。:)我是通过关键字
def
得到的,不是吗?由于大多数情况下,
return
被忽略了。再次出现在《Scala编程,第二版》第72页。“函数定义以def开头”。方法是属于某个类或对象的子例程。是的,通常不放置return语句,因为scala将从上一个语句的结果中获取类型。无论如何,这不是问题的主要目的。@Konstantin Gorodinskiy:这是书中一个众所周知的错误。这不是一个函数,而是一种方法。书中说的“函数”是完全错误的。您也可以将此方法收缩为def a=“some string”。我可能应该重新表述我的问题。如果我不尝试用括号调用第二个函数,这两个变量是一样的?在第74页的《Scala编程,第二版》一书中,有一个没有参数的def示例。它说:“空括号表示函数不接受任何参数”(scala解释器结果中的parenteses)。它们后面是def type。Scala解释器还说def是相等的。我不明白的是为什么第二个符号不理解方括号内的东西=)这很奇怪
scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       a()
        ^
scala> def a() = "aaa"
a: ()java.lang.String

scala> def b = "bbb"
b: java.lang.String

scala> val x = a _
x: () => java.lang.String = <function0>

scala> val y = b _
y: () => java.lang.String = <function0>