【发布时间】:2015-10-12 09:28:59
【问题描述】:
以下代码给我一个 Scala 2.11.7 的错误,这让我很困惑:
class A(val a: String, val bVal: Option[String] = None) {
val b: String = bVal.getOrElse("")
def copy(a: String = a, b: Option[String] = Some(b)) = new A(a, b)
}
IntelliJ IDE 没有显示任何错误,但在编译时出现错误:
Error:(4, 52) type mismatch;
found : Option[String]
required: String
def copy(a: String = a, b: Option[String] = Some(b)) = new A(a, b)
^
为了比较,这编译得很好:
class A(val a: String, val bVal: Option[String] = None) {
val b = bVal
def copy(a: String = a, b: Option[String] = Some(b.getOrElse(""))) = new A(a, b)
}
当我用Some(this.b) 替换Some(b) 时,错误消失了,但我仍然很困惑为什么首先出现错误。看起来编译器正在将Some 中的b 解析为copy 的参数,而不是A 的b 成员。如果是这样,第二个版本怎么编译不出错?
【问题讨论】:
-
如果这不仅仅是展示这种有趣行为的示例,那么当您仅使用
None大小写来定义默认值 ("") 为b。将A定义为class A(val a: String, val b: String = "") { ... }会更容易。 -
@PeterNeyens 这只是一个从更复杂的真实代码简化的展示。