Dado que scala.runtime.RichString se declara como final, no puede extenderlo como class MyString extends RichString
. Me gustaría 'proxeneta la biblioteca' y simplemente agregar otro método. ¿Cómo haría esto?¿Hay alguna manera de extender el RichString de Scala?
Respuesta
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)
- 1. ¿Hay alguna manera de "extender" una clase en SASS?
- 2. ¿Hay alguna manera de extender el comportamiento INameFromTitle de Plone Dexterity?
- 3. ¿Hay alguna manera de omitir el parámetro?
- 4. ¿Alguna manera de extender la línea en la leyenda?
- 5. ¿Existe alguna manera de extender las primeras migraciones de código?
- 6. Android: ¿Hay alguna manera de mostrar DialogPreference desde el código?
- 7. ¿Hay alguna manera de salir del modo de potencia en el intérprete de Scala?
- 8. En C o C++, ¿hay alguna manera de extender una clase sin herencia?
- 9. ¿Hay alguna manera funcional de hacerlo?
- 10. ¿Hay alguna manera de evitar recursiones innecesarias?
- 11. ¿Hay alguna manera de animar diseños? [Android]?
- 12. ¿Hay alguna manera de desactivar una etiqueta?
- 13. ¿Hay alguna manera de desarrollar SmartArt personalizado?
- 14. e.preventDefault - ¿hay alguna manera de hacerlo?
- 15. ¿Hay alguna manera de cancelar StorageFile.CopyAsync()?
- 16. ¿Hay alguna manera de reenviar declarar covarianza?
- 17. ¿Hay alguna manera de obtener el objeto predeterminado de $ .ajax?
- 18. ¿Hay alguna manera de captar el estado real de System.Random?
- 19. ¿Hay alguna manera de conocer el método de invocación?
- 20. ¿Hay alguna manera de cambiar el modo predeterminado de vim?
- 21. ¿Hay alguna manera de eliminar el fondo gris de ImageButtons?
- 22. ¿Hay alguna manera de ralentizar el efecto de desplazamiento?
- 23. ¿Hay alguna manera de cambiar el propietario de un JDialog?
- 24. ¿Hay alguna manera de pausar una CABasicAnimation?
- 25. ¿Hay alguna manera de negar un predicado?
- 26. ¿Hay alguna manera de "reiniciar" la JVM?
- 27. ¿Hay alguna manera de anular ConfigurationManager.AppSettings?
- 28. ¿Hay alguna manera de descompilar Linux .so?
- 29. ¿Hay alguna manera de acelerar Jsoup.parse()?
- 30. ¿Hay alguna manera de "limpiar" una superficie?
impresionante, que hace exactamente lo que quiero. Gracias. – pr1001
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