scala - 了解为什么在Scala中以这种方式定义“pimp my library”

标签 scala

如果要向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/

相关文章:

scala - scala 中的字符串格式 - 最大小数精度

scala - 我“应该”如何使用 scala.collection.immutable.Queue?

scala - 运行SBT runTask时如何访问资源?

scala - 如何在 Play Framework 2 中为我的所有路由添加前缀?

scala - 结合没有重复的 Spark 模式?

scala - 一个 Scala 项目中可以有单独的编译单元吗?

scala - Spark 卡拉: Performance degrade with simple UDF over large number of columns

Scala - future 不运行

scala - 当我在 spark/scala 中使用 window.partitionBy() 函数时,如何保持分区编号不变?

scala - scala 中反向排序的最佳方法是什么?