链接呼叫时省略点

Ady*_*Gil 6 syntax scala

我不明白为什么下面的代码不能编译:

class Abc 
{
    def b (x : String) = x + "abc"

    def a (y : String) =
    {
        val ls : List[String] = y.lines toList
        b (ls.head)
    }
}
Run Code Online (Sandbox Code Playgroud)

Main.scala:8:错误:类型不匹配; 发现:java.lang.String required:Int b(ls.head)

当我将"y.lines toList"更改为

y.lines.toList
Run Code Online (Sandbox Code Playgroud)

甚至到

y.lines toList;
Run Code Online (Sandbox Code Playgroud)

它确实编译.

也许编译器理解它就像

(y.lines).toList(b (ls.head))
Run Code Online (Sandbox Code Playgroud)

或类似的东西,但我仍然不明白规则.

Mar*_*ger 1

它并不明显,它是 Scala 的快捷语法和列表索引的结合。如果您需要提示,请尝试重新定义b为:

def b(x : String) = 0
Run Code Online (Sandbox Code Playgroud)

您将得到一些其他编译器垃圾,但错误将会改变。简而言之,Scala 编译器将允许您省略零参数或单参数方法的括号和点,而且我们知道b它看起来像是以某种方式被链接起来。问题是 Scala 还使用括号进行列表索引,所以toList,它返回一个迭代器,可以将一个参数作为列表索引。我不确定这部分到底是什么,但看起来一旦你开始省略点,词法分析器就会变得贪婪,并且当它遇到可能采用一个参数的方法时,将尝试将下一条语句传递给它。在本例中,这是一个字符串,因此会引发语法错误。