Могу ли я создать метод расширения для существующего метода? И это должен быть метод? - PullRequest
1 голос
/ 28 января 2020

Я хотел бы добавить charAt метод к String, который принимает значение по умолчанию.

Могу ли я вообще это сделать? Как?

Также мне нравится этот трюк, когда кажется, что вы вызываете метод, но вы действительно выбираете объект. Как это работает?

1 Ответ

4 голосов
/ 28 января 2020

Помимо преобразования в ожидаемый тип, два других типа «неявных представлений» в Scala - это когда вы выбираете несуществующего члена, а также когда вы применяете неприменимого члена.

Так что для x.f, если x не имеет f, неявный поиск будет искать преобразование, которое поставляет f.

для x.f(arg), если это не тип check, он будет искать преобразование, которое предоставляет метод f, который выполняет проверку типа.

➜  ~ scala -Yimports:java.lang,scala,scala.Predef,scala.util,scala.util.chaining,scala.util.control.Breaks
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 11.0.3).
Type in expressions for evaluation. Or try :help.

scala> implicit class R(val s: String) { def charAt(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) }
defined class R

scala> "abc".charAt(3, 'z')
res0: Char = z

Поскольку он рассматривает только альтернативные методы в случае неправильного применения, он не работает для использования объект с тем же именем, хотя и с использованием другого имени, работает нормально, потому что это выборка, подобная x.f:

scala> implicit class R(val s: String) { object charAt { def apply(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) } }
defined class R

scala> "abc".charAt(3, 'z')
                       ^
       error: too many arguments (2) for method charAt: (x$1: Int)Char

scala> implicit class R(val s: String) { object charAt2 { def apply(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) } }
defined class R

scala> "abc".charAt2(3, 'z')
res2: Char = z

Спасибо первоначальному автору, спрашивающему об этом; вопрос был слишком быстро отклонен как дубликат, который не был; это вдохновило на сообщение об ошибке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...