Chciałbym, aby ekstraktor niejawnie przekonwertować jego parametry, ale nie wydaje się działać. Rozważmy to bardzo prosty przykład:Scala - niejawna konwersja z unapply
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)
}
Ale nie jestem w stanie go używać jako spodziewałbym:
val Apply(z) = "a" // error: scrutinee is incompatible with pattern type
Czy ktoś może wyjaśnić, dlaczego nie konwertować parametru od String
do MyString
? Spodziewam się, że w locie zadzwoni string2mystring("a")
. Oczywiście mogłem obejść ten problem, mówiąc: val Apply(y) = MyString("a")
, ale nie wydaje mi się, że powinienem to zrobić.
Uwaga: to pytanie jest podobne do pytania this one, ale 1) to, że tak naprawdę nie ma dobrej odpowiedzi, dlaczego tak się dzieje, 2) przykład jest bardziej złożony niż powinien.
Dzięki. To trochę rozczarowujące. Czy wiesz, jaka jest motywacja do tej decyzji? – dhg
Tak, dodając 'def unapply (p: String): Option [String] = Some (p)' to 'Apply' robi lewę. Więc pójdę z tym. Dzięki. – dhg
@dhg Edytowałem odpowiedź - wydaje się, że działa również widok. –