为什么有时 scala 编译器以不同的方式解释空格和点



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

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返回一个ListList有一个apply方法......而这正是编译器正在等待的:List 的 apply 方法的参数。

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

scala> Map(1 -> 2) toList 0
res0: (Int, Int) = (1,2)

最新更新