2011-05-01 75 views
9

如果我创建了一个功能:DEF与无参数

def a(): String = return "some string" 

的结果将是“一个:()字符串” 所以我可以用/使用它,而括号

在另一方面,如果我创建了相同的功能

def a:String = return "some other string" 

这将是只是“:字符串” 在这种情况下,我不能用括号使用它。

这两者有什么区别?

+4

注意:您可以省略'return'关键字 - 在Scala中,方法的结果是方法中最后一个表达式的值。 – Jesper 2011-05-01 20:33:36

+0

您也可以避免指定def类型。我只想指出这是一种功能,所以每个人都会马上看到=) – Konstantin 2011-05-01 20:37:43

+3

但它不是一种功能 - 它是一种方法。 :)我通过关键字'def'得到这个,不是吗?由于大部分时间,'return'被遗漏。 – 2011-05-02 04:30:14

回答

10

良好做法建议确定有没有副作用的功能没有(),并在定义网站和呼叫网站添加()两个当功能有副作用时(例如,println()而不是println)。

6

如果定义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。看看下面,其中xy转成同一件事:

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> 
+0

你也可以缩小这个方法来def a =“some string”。我可能应该改述我的问题。如果我不尝试用括号来调用第二个函数,那么这两个变体是相同的东西? – Konstantin 2011-05-01 20:56:18

+0

在第74页的“Programming in Scala,2nd edition”一书中,有一个def没有参数的例子。它说:“空括号表示该函数不带参数”(在scala解释器的结果中为parenteses)。它们后面跟着def类型。斯卡拉翻译也说,defs是平等的。我不明白的是为什么第二个符号不理解括号内的东西=)这很奇怪 – Konstantin 2011-05-01 21:31:13