Apaçık bir Scala nedir ve ne zaman ihtiyacınız var?
Scala 2.7.2 beri bir şey Java türü silme için geçici bir çözüm olan Manifest
denir. Ama nasıl Manifest
tam olarak ne iş yapar ve neden / ne zaman kullanmak gerekiyor?
Blog yazısıManifests: Reified Types Jorge Ortiz tarafından bazı açıklar, ama birlikte context bounds ile nasıl kullanıldığını açıklamıyor.
Ayrıca, ne Manifest
ne fark eder ClassManifest
,?
Ben bazı kod (parçası daha büyük bir program, olamaz kolayca bulunur burada) bazı uyarılar ile ilgili tip silme; sanırım çözebilir bunları kullanarak gösterir, ama emin değilim tam olarak nasıl.
CEVAP
Derleyici JVM çalışma zamanı kolaylıkla temsil edebilir daha türleri hakkında daha fazla bilgi bilir. Bir Bildirim derleyici kaybolmuş boyutlar-arası çalışma zamanında kod için mesaj türü hakkında bir bilgi göndermek için bir yoldur.
Bu Kleptonians fosil kayıtları kodlanmış mesajlar kaldığını ve "DNA insan. önemsiz benzer Lightspeed ve yerçekimi rezonans alanları sınırlamalar nedeniyle doğrudan iletişim kuramıyor. Ama, eğer onların sinyali ayarlamak için nasıl biliyorsanız, olamaz yollarını düşünün, öğle yemeği için ne yemek ya da oynamak için hangi bir karar istifade edebilirsiniz.
Eğer bir Bildirim daha fazla ayrıntı bilmeden gördüğünüz hataları yararlanacak belli değil.
Bildirimlerin yaygın bir kullanım kodunuzu farklı bir koleksiyon statik Türüne göre davranır. Örneğin, eğer bir Liste[String] tedavi etmek isteseydin ne farklı bir Liste diğer türleri:
def foo[T](x: List[T])(implicit m: Manifest[T]) = {
if (m <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
foo(List("one", "two")) // Hey, this list is full of strings
foo(List(1, 2)) // Non-stringy list
foo(List("one", 2)) // Non-stringy list
Bu yansıma tabanlı bir çözüm muhtemelen listesindeki her öğe teftiş içerecektir.
Bir bağlam bağlı scala yazın-sınıfları kullanarak için en uygun gibi, burada da Debasish Ghosh tarafından açıklanmıştır: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
İçerik sınırları da sadece yöntem imzaları daha okunaklı hale getirebilir. Örneğin, yukarıdaki işlevi yeniden yazılmış gibi yani bağlam sınırları kullanıyor olabilir:
def foo[T: Manifest](x: List[T]) = {
if (manifest[T] <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
Parantez ve parantez, Scala, resmi ara...
(Ya da ihmal) kullanmak için zaman var...
Akıllı bir işaretçi nedir ve ne zaman ...
Nerede Scala implicits durumu nedir?...
Scala'nin verimi nedir?...