SORU
6 AĞUSTOS 2010, Cuma


Ne <:< <%<,=: = Scala 2.8 ve belgelenmiştir nerede onlar?

API genel işlevi, bir tür alt sınıflar (Dan) olduklarını Predef için dokümanlar görebiliyorum =>Ama bu kadar yazıyor. Um, ne? Belki bir yerlerde belgeleri var, ama arama motorları kolu yok "isim""&;:< lt;" çok iyi, bu yüzden onu bulmak mümkün olmamıştır.

Ne zaman funky/sınıflar bu semboller, ve neden kullanmalıyım? takip soru:

CEVAP
6 AĞUSTOS 2010, Cuma


Bu denirtip kısıtlamalar genelleştirilmiş. Senin yazın parametreli bir sınıf veya özellik içinde, izin veriyorlardaha da sınırlamakyazın parametrelerinden biri. İşte size bir örnek:

case class Foo[A](a:A) { // 'A' can be substituted with any type
    // getStringLength can only be used if this is a Foo[String]
    def getStringLength(implicit evidence: A =:= String) = a.length
}

Örtük değişken evidence ıff A String ıff derleyici tarafından sağlanır. Bir olarak düşünebilirsinizkanıtA String--kendisi önemli değil argüman, var olduğunu biliyor.[edit: teknik olarak aslında önemli, çünkü temsil ettiği bir örtük dönüştürme A String, ne olduğunu aramanızı sağlar a.length var derleyici bağırdı

Şimdi öyle gibi kullanabilirsiniz:

scala> Foo("blah").getStringLength
res6: Int = 4

Ama eğer kalkarsam Foo içeren bir şey String dışında onu kullanın:

scala> Foo(123).getStringLength
<console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]

Bu hata okuyabilirsiniz "= = İnt dair kanıt bulamadı Dize"... olması gerektiği gibi! getStringLength dayatmaktadırdaha fazla kısıtlamagenel olarak Foo gerektirir ne daha A türüne; yani, sadece Foo[String] getStringLength çağırabilirsiniz. Bu kısıtlama harika bir derleme, uygulanır!

<:< <%< benzer şekilde, ama küçük farklılıklar ile çalışır:

  • A =:= B kesinlikle B olmalı
  • A <:< B A B (benzer . sadece bir tarafta olması gerektiği anlamına gelir ^em>basittür kısıtlaması) 25**
  • A <%< B Bir olması gerektiği anlamına gelirgörüntülenebilirB olarak, muhtemelen örtük dönüştürme) (basit tür kısıtlaması <% benzer)

@This snippet retronym bu tür bir şey başarılı olmak için kullanılan nasıl ve ne kadar yaygın türü kısıtlamaları daha kolay şimdi yapmak iyi bir açıklama.

EK

Cevap için takip soru, kuşkusuz verdiğim örnek oldukça yapmacık ve açıkçası kullanışlı değil. Ama tamsayılar listesi ekler List.sumInts bir yöntem gibi bir şey tanımlamak için kullanarak düşünün. Bu yöntem, herhangi bir eski çağrılmasına izin vermek istemiyorum List sadece List[Int]. Ancak List tür yapıcı çok constrainted olamaz; hala dizeler, foos, barlar ve whatnots listeleri var edebilmek istiyorum. Yani sumInts, genelleştirilmiş tür bir kısıtlama yerleştirerek sağlayabilirsinizsadece bu yöntemisadece List[Int] kullanılabilir ek bir kısıtlama var. Aslında listeler belirli türde özel durum kodu yazıyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • Friday NightFort

    Friday Night

    15 EYLÜL 2011