scala – 链接呼叫时省略点

前端之家收集整理的这篇文章主要介绍了scala – 链接呼叫时省略点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不明白为什么下面的代码不能编译:

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会变得贪婪,当遇到可能需要一个参数的方法时,会尝试将下一个语句传递给它.在这种情况下,这是一个字符串,因此它会引发语法错误.

原文链接:https://www.f2er.com/scala/827918.html

猜你在找的Scala相关文章