2010-06-20 12 views

Respuesta

15

Dado que una regla clave de implicits es que solo se aplica alguna para hacer una (sub) expresión dada, check-type, pimping RichString para agregar a su vez al complemento de métodos que agrega a String no permitirá usted puede ver los métodos de su clase RicherString (si lo desea) como si estuvieran disponibles directamente en las instancias de String. Estarían disponibles si tuviera un RichString, por supuesto, y las instancias RichString están trivialmente disponibles desde String instancias por simple tipo de adscripción. Pero aún así, no es lo que alguien llamaría conveniente.

Por razones prácticas, lo que está pidiendo no es realmente posible en Scala.

Por otro lado, si solo necesita alternar aumento de String, puede definir su propia clase de cadena aumentada. Si no existe una superposición entre los métodos que define y los definidos en RichString, nunca habrá ninguna ambigüedad para que el compilador resuelva al decidir qué aplicar. Eso es probablemente lo suficientemente bueno, ¿verdad?

Además, este enfoque (una conversión implícita alternativa no superpuesta) no se romperá cuando cambie a Scala 2.8, que tiene StringOps en lugar de RichString.

Para ello, deberías hacer algo similar a lo siguiente:

class MyRichString(underlying:String){ 
    def myNewMethod = { ... } 
} 

implicit def addMyMethods(s:String)=new MyRichString(s) 
+0

impresionante, que hace exactamente lo que quiero. Gracias. – pr1001

+0

De hecho, ese patrón es tan común que [clases implícitas] (http://docs.scala-lang.org/overviews/core/implicit-classes.html) se incluyeron como oficiales. – jeslg

Cuestiones relacionadas