SCALA创建函数语法

时间:2015-03-26 14:39:02

标签: scala function

我是斯卡拉新手,我认为它是一种非常丰富的语言。让我抓住语法的一件事就是功能创建。我理解大括号{}在很多情况下被编译器解释为与括号()的同义词,但以下我仍然不太明白。

以下是Scala REPL的输出:

scala> def index = List {}
index: List[Unit]


scala> def index = List ()
index: List[Nothing]

Q1。

如果我正确理解了上述内容,我正在创建一个名为index的函数,它创建一个新的列表(new由于隐式调用apply方法而被省略了吗?)。< / p>

我看到Unit(相当于Java中的null?)是使用大括号{}时的列表类型。但是使用parens()时没有什么类型。

Q2。

有人可以用简单的术语(如果可能的话)解释在创建函数时使用{}()以及Nothing代表什么之间的区别吗?


编辑 - 所以以下是等效的?

def index = List {val a = 1; a}
def index = List ({val a = 1; a})

我还在与functionmethod似乎可以互换使用的地方进行了一些努力。

上述两者都可以被视为functionmethod,这是否正确? 或者它取决于你与谁交谈?

1 个答案:

答案 0 :(得分:5)

  

如果我正确理解了上述内容,我正在创建一个名为index的函数,它创建一个新的List(由于隐式调用apply方法,因此省略了new?)。

     

(由于隐式调用apply方法权限而省略new;)

是的,有点儿。 List.apply构造List并将其返回给您的方法。

def index = List {}创建一个名为index的方法,通过调用List来创建新的List.apply

  

有人可以用简单的术语(如果可能的话)解释在创建函数时使用{}和()与Nothing代表什么之间的区别?

空花括号{}表示匿名函数,而不是简单的元素列表。例如,我可以这样做:

scala> def index = List {val a = 1; a}
index: List[Int]

您的方法等同于(省略括号):

def index = List({})

匿名函数的结果传递给apply。当大括号为空时,匿名函数的返回类型为Unit。我们得到List[Unit]

def index = List ()始终返回空List。但是,由于您没有注释,编译器无法从中推断出类型,因此它被推断为Nothing,它是每种其他类型的子类型。这允许我们将List[Nothing]List[Int]组合并仍然可以编译。

  

我看到那个单位(相当于Java中的null?)......

Unit是不返回任何内容的方法的返回类型。与Java中的void类似,而不是null