簡體   English   中英

理解為什么“pimp my library”在Scala中以這種方式定義

[英]Understanding why “pimp my library” was defined that way in 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覆蓋的包來使用它。

它似乎涉及較少的輸入,不需要我創建名稱,並具有更好的性能(不調用方法和創建對象)。 隱式轉換方法所做的任何事情都可以在附加方法中完成。

我確定我錯過了一些東西,並想深入了解一下。

隱式轉換還有其他用途,而不僅僅是“皮條客我的圖書館”習慣用法,所以它並不是“為什么他們不這樣做呢?”,而是“他們為什么不這樣做呢?” 。 當然,我沒有理由不按照你的建議添加擴展方法語法,並且它可能會更清晰,但是由於該語言已經支持一種實現相同效果的方法,因此沒有太多迫切需要它。 。

2011年10月更新:

有一個新的提議,為這個用例添加語法糖: http//scala.github.com/sips/pending/implicit-classes.html

如何在不需要顯式導入並為其命名的情況下阻止該方法進入范圍? 事實上,如果沒有這樣做,程序如何知道添加了哪些方法呢?

當你使用三個不同的庫時,其中兩個以不兼容的方式向第三個庫添加方法,如何在不受控制的情況下解決這個問題?

除此之外,由於JVM不允許更改現有類,因此無法獲得更好的性能。 充其量,您可以獲得不必創建名稱並且必須以不能控制正在執行的操作為代價來減少打印的好處。

最后要注意的是,如果你想做空,你可以這樣做:

implicit def fooBar(f: Foo) = new { def newMethod = bar }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM