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
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.
Nerede Scala implicits durumu nedir?...
ADO.NET |DataDirectory| nerede bu belg...
Nerede Scala "***" s O flatma...
Nerede C statik sabit başlatılamıyor...
Dava Scala vs Listeleme nesneleri...