2011-07-18 15 views
8

Ekstraktörü parametrelerini örtük olarak çevirmeyi tercih ediyorum, ancak işe yaramıyor gibi görünüyor. Bu çok basit bir durum düşünün:Scala - uns undes ile kapalı dönüşüm

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) 
} 

Ama beklediğiniz gibi onu kullanmak mümkün değilim:

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

kimse o String den MyString parametreyi dönüştürmek için başarısız neden açıklayabilir misiniz? Anında string2mystring("a") aramasını beklerdim. Açıkça ben bu konu etrafında val Apply(y) = MyString("a") söyleyerek çalışabilirim, ama bunu yapmak zorundayım gibi görünmüyor.

Not: Bu soru this one'a benzer, ancak 1) bunun neden olduğuna dair gerçekten iyi bir cevabı olmadığını, 2) örnek olması gerekenden daha karmaşıktır.

cevap

14

Kalıp eşleştiğinde örtük dönüşümler uygulanmaz. Bu kodunuzda bir hata veya sorun değil, sadece Scala'nın yaratıcılarının tasarım kararı.

Düzeltmek için, String kabul eden başka bir çıkarıcı yazmanız gerekir;

Alternatif olarak, hem de iş gibi görünüyor bağlı bir görünüm ile deneyebilir ve daha sonra MyString diğer örtük dönüşümleri tanımlarsanız da çalışacaktır:

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

teşekkür ederiz. Bu biraz hayal kırıklığı yaratıyor. Bu karar için motivasyonun ne olduğunu biliyor musun? – dhg

+0

Evet, "unapply def" (p: String) eklensin: Seçenek [String] = Bazı (p) 'to' Apply' hile yapar. Ben de onunla gideceğim. Teşekkürler. – dhg

+0

@dhg Cevabı düzenledim - bir görünüm de işe yarıyor gibi görünüyor. –