Scala - неявное преобразование с неприменением - PullRequest
8 голосов
/ 18 июля 2011

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

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"), но, похоже, я не должен был это делать.

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

1 Ответ

14 голосов
/ 18 июля 2011

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

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

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

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