1

例如,如果我写这个函数:

def function1() : Unit = {            
 aVar = myList.map { ( s :Something ) => (s.id, s.name) } toList
 function2()
}

def function2() : Unit = {
   //bla
}

编译器在调用时会抱怨function2expecting Intbut found 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()
    }

看起来有一个空格而不是一个点有时可能很危险,但我不知道为什么。

4

1 回答 1

4

使用空间而不是.在 scala 中应该最好通过以下方式与一个参数函数一起使用:

myObject itsFunction param

因此,当您键入 myMap 时toList,编译器仍在等待一个参数,并从下一行代码中获取它,而当您键入myMap.toList它时,它不会等待任何内容,它会将 function2 视为独立指令。function2当您将结果分配给 a时,情况完全相同var。编译器一看到var声明,就知道前面的语句是关闭的,不再需要参数。

在这里,您应该想知道编译器期望什么参数,因为toList不需要任何参数。实际上,toList返回一个ListList有一个apply方法......这正是编译器正在等待的:Listapply 方法的参数。

也许这个 REPL 会话会帮助你:

scala> Map(1 -> 2) toList 0
res0: (Int, Int) = (1,2)
于 2012-05-31T06:20:18.920 回答