加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 链接呼叫时省略点

发布时间:2020-12-16 18:48:01 所属栏目:安全 来源:网络整理
导读:我不明白为什么下面的代码不能编译: 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.hea
我不明白为什么下面的代码不能编译:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读