例如,如果我写这个函数:
def function1() : Unit = {
aVar = myList.map { ( s :Something ) => (s.id, s.name) } toList
function2()
}
def function2() : Unit = {
//bla
}
编译器在调用function2
时抱怨说期待Int
但发现Unit
。我只是无法弄清楚所需的Int
来自哪里。
现在,如果我按如下方式编写function1
,它会完全按照我的预期编译和工作:
def function1() : Unit = {
aVar = myList.map { ( s :Something ) => (s.id, s.name) } toList
var x = function2()
}
为什么!!!!????仅将function2
分配给var
会更改行为??首先,function2
被定义为返回Unit
...
它变得更加纠结,接下来的两个function1
定义中的任何一个都可以完美地工作:
def function1() : Unit = {
aVar = myList.map { ( s :Something ) => (s.id, s.name) }.toList
function2()
}
def function1() : Unit = {
aVar = (myList.map { ( s :Something ) => (s.id, s.name) } toList)
function2()
}
看起来有一个空格而不是一个点有时可能很危险,但我不知道为什么。
在 scala 中使用空格而不是 .
最好按以下方式与一个参数函数一起使用:
myObject itsFunction param
因此,当您键入 myMap toList
时,编译器仍在等待参数,并从下一行代码中获取它,而当您键入 myMap.toList
时,它不会等待任何内容,它将 function2 视为独立指令。当您将function2
的结果分配给var
时,情况完全相同。编译器一旦看到var
声明,它就会知道上一条语句已关闭,不再需要参数。
在这里,您应该想知道编译器需要什么参数,因为toList
不需要任何参数。实际上,toList
返回一个List
,List
有一个apply
方法......而这正是编译器正在等待的:List
的 apply 方法的参数。
也许这个 REPL 会议会帮助你:
scala> Map(1 -> 2) toList 0
res0: (Int, Int) = (1,2)