为什么带有点的scala val定义会在稍后的阶段产生错误而不是解析
发布时间:2020-12-16 18:04:31 所属栏目:安全 来源:网络整理
导读:在回答另一个问题的评论时,我尝试将此代码放入 Scala: trait Foonew Foo { self = val self.x = 3} 当然,它没有编译,但错误令我感到困惑: recursive value x$1 needs type val self.x = 3 ^ 这段代码是如何通过解析器的? -Xprint:parse也有点奇怪: synt
在回答另一个问题的评论时,我尝试将此代码放入
Scala:
trait Foo new Foo { self => val self.x = 3 } 当然,它没有编译,但错误令我感到困惑: recursive value x$1 needs type val self.x = 3 ^ 这段代码是如何通过解析器的? -Xprint:parse也有点奇怪: <synthetic> private[this] val x$1 = 3: @scala.unchecked match { case self.x => () } 这是3的类型注释中的匹配吗?编辑:显然不是;那是the syntax for annotations. 解决方法
Scala中的变量定义实际上是模式匹配.也就是说,当你写作
val x = y println(x) 这与写作基本相同 y match { case x => println(x) 这可以很容易地在这样的事情中看到: val List(a,b,c) = someList val RegexPattern(year,month,date) = "2013-10-23" 另一个有效的是常量模式匹配: object X { val One = 1 } scala> val X.One = 1 scala> val X.One = 2 scala.MatchError: 2 (of class java.lang.Integer) 任何带括号的东西都会调用一个提取器: object Y { val ymd = """(dddd)-(dd)-(dd)""".r } scala> val Y.ymd(year,day) = "2013-10-23" year: String = 2013 month: String = 10 day: String = 23 所以,你看,你写的东西在语法上是非法的,只是细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |