如果我创建了一个功能:DEF与无参数
def a(): String = return "some string"
的结果将是“一个:()字符串” 所以我可以用/使用它,而括号
在另一方面,如果我创建了相同的功能
def a:String = return "some other string"
这将是只是“:字符串” 在这种情况下,我不能用括号使用它。
这两者有什么区别?
如果我创建了一个功能:DEF与无参数
def a(): String = return "some string"
的结果将是“一个:()字符串” 所以我可以用/使用它,而括号
在另一方面,如果我创建了相同的功能
def a:String = return "some other string"
这将是只是“:字符串” 在这种情况下,我不能用括号使用它。
这两者有什么区别?
良好做法建议确定有没有副作用的功能没有()
,并在定义网站和呼叫网站添加()
两个当功能有副作用时(例如,println()
而不是println
)。
如果定义a
这样的,不带括号(注意,该return
关键字是没有必要的):
def a: String = "some other string"
,然后用括号把它叫做: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()
^
所以,在第二种情况下,a()
意味着什么比在第一种情况下别人。在第一种情况下,它仅仅意味着“使用空参数列表呼叫a
”,并且在第二种情况下意味着“呼叫a
,然后将()
应用于该方法的结果”,其将在String
上失败。
编辑要在下面的评论中扩展您的第二个问题,这取决于您的意思是“同一件事”。正如您在REPL中看到的,它看起来像是()java.lang.String
,而另一个类型是java.lang.String
。看看下面,其中x
和y
转成同一件事:
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>
你也可以缩小这个方法来def a =“some string”。我可能应该改述我的问题。如果我不尝试用括号来调用第二个函数,那么这两个变体是相同的东西? – Konstantin 2011-05-01 20:56:18
在第74页的“Programming in Scala,2nd edition”一书中,有一个def没有参数的例子。它说:“空括号表示该函数不带参数”(在scala解释器的结果中为parenteses)。它们后面跟着def类型。斯卡拉翻译也说,defs是平等的。我不明白的是为什么第二个符号不理解括号内的东西=)这很奇怪 – Konstantin 2011-05-01 21:31:13
注意:您可以省略'return'关键字 - 在Scala中,方法的结果是方法中最后一个表达式的值。 – Jesper 2011-05-01 20:33:36
您也可以避免指定def类型。我只想指出这是一种功能,所以每个人都会马上看到=) – Konstantin 2011-05-01 20:37:43
但它不是一种功能 - 它是一种方法。 :)我通过关键字'def'得到这个,不是吗?由于大部分时间,'return'被遗漏。 – 2011-05-02 04:30:14