Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Scala - неявное преобразование с неприменением

Автор вопроса: dhgОтветов: 1

Я бы хотел, чтобы экстрактор неявно преобразовывал свои параметры, но, похоже, это не работает. Рассмотрим этот очень простой случай:

case class MyString(s: String) {}

implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s

object Apply {
    def unapply(s: MyString): Option[String] = Some(s)
}

Но я не могу использовать его так, как ожидал:

val Apply(z) = "a"  // error: scrutinee is incompatible with pattern type

Кто-нибудь может объяснить, почему не удается преобразовать параметр из String в MyString? Я ожидаю, что он вызовет string2mystring("a") на лету. Ясно, что я мог бы обойти проблему, сказав val Apply(y) = MyString("a"), но не похоже, что я должен был это делать.

Примечание. Этот вопрос аналогичен one, но 1) на самом деле нет хорошего ответа, почему это происходит, 2) пример сложнее, чем нужно.

scalaimplicit-conversionunapply

Ответы

Ответ 1 · рейтинг 14 · Jean-Philippe Pellet

Неявные преобразования не применяются при сопоставлении с образцом. Это не ошибка или проблема с вашим кодом, это просто дизайнерское решение создателей Scala.

Чтобы исправить это, вы должны написать еще один экстрактор, который принимает String, что, в свою очередь, может вызвать ваше неявное преобразование.

В качестве альтернативы вы можете попробовать с привязкой к представлению, которая, похоже, тоже работает, а также будет работать, если вы позже определите другие неявные преобразования в MyString:

object Apply {
  def unapply[S <% MyString](s: S): Option[String] = Some(s.s)
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы