2011-07-18 15 views
8

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.

Odpowiedz

14

Konwersje niejawne nie są stosowane podczas dopasowywania wzorca. To nie jest błąd ani problem z kodem, to po prostu decyzja projektowa twórców Scali.

Aby to naprawić, należy napisać inny ekstraktor, który akceptuje numer String - który z kolei może wywołać niejawną konwersję.

Alternatywnie, można spróbować z widokiem związany, który wydaje się działać jak dobrze, i będzie również działać, jeśli później określić inne niejawne konwersje do MyString:

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

Dzięki. To trochę rozczarowujące. Czy wiesz, jaka jest motywacja do tej decyzji? – dhg

+0

Tak, dodając 'def unapply (p: String): Option [String] = Some (p)' to 'Apply' robi lewę. Więc pójdę z tym. Dzięki. – dhg

+0

@dhg Edytowałem odpowiedź - wydaje się, że działa również widok. –

Powiązane problemy