Есть ли способ расширить RichString в Scala? - PullRequest
8 голосов
/ 21 июня 2010

Так как scala.runtime.RichString объявлен как final, вы не можете расширять его как class MyString extends RichString. Я хотел бы «развернуть библиотеку» и просто добавить другой метод. Как бы я это сделал?

1 Ответ

15 голосов
/ 21 июня 2010

Так как ключевое правило имплицитов состоит в том, что только одна из них когда-либо применяется для проверки заданного (под-) выражения типа, pimping RichString, чтобы добавить в свою очередь набор методов, добавляемых к String не позволит вам видеть методы вашего класса RicherString (если хотите), как если бы они были доступны непосредственно в экземплярах String. Конечно, они были бы доступны, если бы у вас было RichString экземпляров, а RichString экземпляров тривиально доступны из String экземпляров простым указанием типа. Но все же, это не то, что кто-то назвал бы удобным.

Так что в практических целях то, о чем вы просите, в Scala на самом деле не возможно.

С другой стороны, если вам просто нужно альтернативное увеличение String, вы можете просто определить свой собственный класс дополненной строки. Если нет совпадений между методами, которые он определяет, и методами, определенными в RichString, компилятору никогда не будет разрешена неопределенность при принятии решения о том, что применять. Это, наверное, достаточно хорошо, верно?

Кроме того, этот подход (альтернативное, не перекрывающееся неявное преобразование) не будет нарушен при переходе на Scala 2.8, в которой вместо 1011 *

вместо RichString.

Для этого вам нужно сделать что-то похожее на следующее:

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

implicit def addMyMethods(s:String)=new MyRichString(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...