Существует ли способ расширить RichString Scala?

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

8
задан pr1001 20 June 2010 в 23:20
поделиться

1 ответ

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

Итак, с практической точки зрения то, о чем вы просите, в Scala невозможно.

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

Кроме того, этот подход (альтернативное не перекрывающееся неявное преобразование) не сломается, когда вы переключитесь на Scala 2.8, в котором вместо используется StringOps RichString .

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

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

implicit def addMyMethods(s:String)=new MyRichString(s)
15
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: