我不明白为什么下面的代码不能编译:
class Abc { def b (x : String) = x + "abc" def a (y : String) = { val ls : List[String] = y.lines toList b (ls.head) } }
Main.scala:8:错误:类型不匹配;
发现:java.lang.String
必需:Int
b(ls.head)
当我将“y.lines toList”更改为
y.lines.toList
甚至到
y.lines toList;
它确实编译.
也许编译器理解它就像
(y.lines).toList(b (ls.head))
或类似的东西,但我仍然不明白规则.
解决方法
它并不明显,它是Scala的快捷语法和列表索引的组合.如果您需要提示,请尝试将b重新定义为:
def b(x : String) = 0
你会得到一些其他的编译器垃圾,但错误会改变.简而言之,Scala编译器会让你省略零参数或单参数方法的parens和dot,而且我们知道b看起来像是以某种方式被链接起来了.问题是Scala还使用parens进行列表索引,所以toList,返回一个迭代器,可以将一个参数作为列表索引.我不确定这部分是什么,但看起来就像你开始省略点,lexer会变得贪婪,当遇到可能需要一个参数的方法时,会尝试将下一个语句传递给它.在这种情况下,这是一个字符串,因此它会引发语法错误.