如果要向Scala中的类添加方法,则需要执行以下操作:
class RichFoo(f: Foo) {
def newMethod = f.bar()
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
然后
f.newMethod
将导致创建RichFoo
实例并调用其方法。我试图理解为什么它没有像Ruby那样定义:
override class Foo {
def newMethod = bar
}
编译器可以查看此定义,并使用静态方法newMethod创建FooOverride类,该方法获取类型为Foo的参数并调用其bar方法。这就是Scala实现特征的方式。我仍然需要导入包含Foo覆盖的程序包才能使用它。
它似乎涉及较少的键入,不需要我发明名称,并且具有更好的性能(不调用方法和创建对象)。隐式转换方法所做的任何事情都可以在附加方法中完成。
我确定我错过了一些东西,想了解一下。
最佳答案
隐式转换还有其他用途,而不仅仅是“ pimp my library”这个习惯用法,因此并不是“为什么他们不这样做呢?”的真实案例,而是“他们为什么也没有这样做呢?” 。当然,我看不出没有任何理由不能像您建议的那样添加扩展方法语法,这可能会更简洁一些,但是鉴于该语言已经支持实现相同效果的方式,因此并没有太多迫切需要。
2011年10月更新:
有一个新建议为该用例添加语法糖:http://scala.github.com/sips/pending/implicit-classes.html
关于scala - 了解为什么在Scala中以这种方式定义“pimp my library”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913591/