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

为什么scala编译器有时会以不同的方式解释空格和点,scala,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
 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
即可更改行为??首先,
函数2
被定义为返回
单元

接下来它变得更加复杂,接下来的两个
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)

在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)

好的,这是有效的,但容易出错?为什么在使用toList时会在后台调用apply函数?@rsan:因为在编写
x()
时总是调用apply函数。由于
xs-toList
被解释为
xs.toList()
由于
toList
.Tnx的参数丢失,因此引发了一个错误。我认为尼古拉斯提到的“最好”是这里的关键。有趣的是,在你在网络上找到的几乎所有例子中,你都会看到toList、toMap等带有空格而不是圆点。每天你都会学到新东西:)@rsan问题是你使用的是后缀方法语法,即
myList-toList
而不是
myList.toList
。除非在DSL中,否则不鼓励这样做,因为这可能会导致像您这样的问题。当SIP-18生效时,它将隐藏在语言标志后面,以防止滥用。好的,这是有效的,但容易出错?为什么在使用toList时会在后台调用apply函数?@rsan:因为在编写
x()
时总是调用apply函数。由于
xs-toList
被解释为
xs.toList()
由于
toList
.Tnx的参数丢失,因此引发了一个错误。我认为尼古拉斯提到的“最好”是这里的关键。有趣的是,在你在网络上找到的几乎所有例子中,你都会看到toList、toMap等带有空格而不是圆点。每天你都会学到新东西:)@rsan问题是你使用的是后缀方法语法,即
myList-toList
而不是
myList.toList
。除非在DSL中,否则不鼓励这样做,因为这可能会导致像您这样的问题。当SIP-18生效时,它将隐藏在语言标志后面,以防止滥用。