我是斯卡拉新手,我认为它是一种非常丰富的语言。让我抓住语法的一件事就是功能创建。我理解大括号{}在很多情况下被编译器解释为与括号()的同义词,但以下我仍然不太明白。
以下是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})
我还在与function
和method
似乎可以互换使用的地方进行了一些努力。
上述两者都可以被视为function
或method
,这是否正确?
或者它取决于你与谁交谈?
答案 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
。