2012-02-22 3 views
6

Это два разных способа его реализации.Каков наилучший способ использования обогатительной библиотеки в scala?

Один более короткий

implicit def toR1(s:String) = new { def getLength = s.length)} 

Во-вторых, более длинный

class R2(s:String){def getLength2 = s.length)} 
implicit def toR2(s:String) = new R2(s) 

Какой из них лучше?

+4

'неявный класс R3 (s: String) {Защиту GetLength = s.length}' :) Я очень надеюсь, что он будет включен в Scala 2.10: http://docs.scala-lang.org/sips/pending/implicit-classes.html – tenshi

+2

Возможный дубликат: [Как реализовать промежуточные типы для неявных методов?] (Http://stackoverflow.com/questions/5220359/как в реализации-промежуточные типы-For-неявных-методов/5220725). TL; DR второй лучше по производительности, поскольку первый способ использует отражение под капотом. –

+0

неявные классы _are_ включены в Scala 2.10, поэтому, возможно, единственный ответ на этот вопрос в настоящее время устарел. – matanster

ответ

11

В первой версии используется structural type. Это позволяет писать короткий и читаемый код, но недостатком структурных типов является то, что отражение используется во время выполнения, когда вы вызываете метод в структурном типе. Вызов метода с помощью отражения медленнее, чем вызов метода напрямую.

Более подробная информация в этом блоге (написанный мной): Avoid structural types when pimping libraries

+0

@ Энди спасибо, заменил ссылку. – Jesper

Смежные вопросы