【发布时间】:2013-06-22 21:18:47
【问题描述】:
本质上类似于subtle differences between val and def的问题。我想知道拥有成员单例对象之间的语义区别是什么:
class Text {
...
object Whitespace { def unapply(s :String) =
if (s.forall(_.isWhitespace)) Some(s) else None
}
}
和
class Text {
...
val Whitespace = new { def unapply(s :String) =
if (s.forall(_.isWhitespace)) Some(s) else None
}
}
我知道两者如何转换为字节码,但我可以用代码中的一个做什么而我不能用另一个做什么?
【问题讨论】:
-
我会让其他人更全面地发表评论,但第二个使用反射调用
unapply!避免! (如果您只是覆盖现有方法或实现抽象方法,这很好,但是任何 new 方法都会通过反射调用。幸运的是,编译器会警告您。) -
@RégisJean-Gilles 我不同意。在您引用的问题中,所需的值扩展了给定的类,没有其他成员。在这里,OP 想要定义新成员(这显然是查看 Rex 评论的一个问题)。