2012-02-22 5 views
6

Hay dos maneras diferentes de implementarlo.¿Cuál es la mejor manera de usar enriquecer-mi-biblioteca en scala?

Una de ellas es más corta

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

En segundo lugar es más larga

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

cuál es mejor?

+4

'clase implícita R3 (s: String) {def getLength = s.length}' :) Realmente espero que se incluirá en Scala 2.10: http://docs.scala-lang.org/sips/pending/implicit-classes.html – tenshi

+2

un posible duplicado: [? Cómo implementar tipos intermedios para los métodos implícitos] (http://stackoverflow.com/questions/5220359/how-to-implementation-intermediate-types-for-implicit-methods/5220725). TL; DR el segundo es mejor en cuanto a rendimiento ya que la primera forma usa la reflexión bajo el capó –

+0

clases implícitas _ están incluidas en Scala 2.10, por lo que tal vez la respuesta actual a esta pregunta sea obsoleta. – matanster

Respuesta

11

La primera versión utiliza un structural type. Hace posible escribir código breve y legible, pero una desventaja de los tipos estructurales es que la reflexión se usa en tiempo de ejecución cuando se llama al método en el tipo estructural. Llamar a un método por reflexión es más lento que llamar directamente a un método.

más detalles en esta entrada del blog (escrito por mí): Avoid structural types when pimping libraries

+0

@Andy gracias, reemplazó el enlace. – Jesper

Cuestiones relacionadas