Vs türü sınıf örtük dönüştürme
Scala, en az iki yöntem mevcut veya yeni tip güçlendirme için kullanabiliriz. Bir şey Int
kullanarak ölçülebildiğine ifade etmek istiyoruz diyelim. Aşağıdaki özellik tanımlayabiliriz.
Örtük dönüştürme
trait Quantifiable{ def quantify: Int }
Ve sonra örtülü dönüşüm örneğin Dizeleri ve Listeler ölçmek için kullanabiliriz.
implicit def string2quant(s: String) = new Quantifiable{
def quantify = s.size
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{
val quantify = l.size
}
Bu aldıktan sonra, yöntemi dizeleri ve listeler quantify
diyebiliriz. Ölçülebilir listesi quantify
sonraki çağrılarda listenin pahalı geçişi önler yani uzunluğu mağazaları, unutmayın.
Türü sınıflar
Tanımlamak için alternatif bir "tanık" 16 ** bazı tip ölçülebildiğine Quantified[A]
belirtmektedir.
trait Quantified[A] { def quantify(a: A): Int }
Biz o zaman String
Bu tür sınıf ve List
yere örneklerini sağlamak.
implicit val stringQuantifiable = new Quantified[String] {
def quantify(s: String) = s.size
}
Ve eğer biz o zaman bağımsız değişkenleri ölçmek için gereken bir yöntem yazmak, yazmak:
def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) =
as.map(ev.quantify).sum
Ya da bağlamı kullanarak sözdizimi bağlı:
def sumQuantities[A: Quantified](as: List[A]) =
as.map(implicitly[Quantified[A]].quantify).sum
Ama ne zaman hangi yöntemi kullanacak?
Şimdi soru geliyor. Nasıl bu iki kavram arasında karar verebilirim?
Şimdiye kadar fark ettiğim şey.
türü sınıflar
- türü sınıfı iyi bir içerik sözdizimi bağlı izin verir
- tip sınıflar ile her kullanımda yeni bir kapsayıcı nesnesini oluşturmak istemiyorum
- bağlam bağlı sözdizimi türü sınıfı birden fazla tür parametreleri varsa artık çalışmıyor; sadece bazı genel türü değerleri ile tamsayılar ama işler ölçmek istiyorum hayal
T
. Türü sınıfıQuantified[A,T]
oluşturmak istiyorum
örtük dönüştürme
- çünkü ben yeni bir nesne, ben önbellek değerleri var ya da hesaplamak daha iyi bir temsil; ama yapmalıyım kaçının bu yana olabileceğini defalarca ve açık bir dönüşüm olur çağrılan sadece bir kez?
Ben bir cevap bekliyoruz
Mevcut bir (veya daha fazla) iki kavram arasındaki fark önemli olduğu durum(lar) ve diğer üzerinden bir tercih neden yaptığını açıklar. Ayrıca iki kavram özü ve birbirleriyle ilişkileri anlatan iyi bir örnek olabilir.
CEVAP
Scala In Depth, benim malzeme çoğaltmak istemiyorum tip sınıflar/ tip özellikleri son derece esnek olduğunu belirtmekte yarar var sanırım.
def foo[T: TypeClass](t: T) = ...
Arama özelliği varsayılan bir typeclass için yerel çevresi vardır. Ancak, iki yoldan biri tarafından herhangi bir zamanda varsayılan davranışı geçersiz kılar.
- Oluşturma/kısa devre Kapsamı içinde örtülü örneği arama sınıf örtülü bir tür alma
- Doğrudan tür bir sınıf geçme
İşte size bir örnek:
def myMethod(): Unit = {
// overrides default implicit for Int
implicit object MyIntFoo extends Foo[Int] { ... }
foo(5)
foo(6) // These all use my overridden type class
foo(7)(new Foo[Int] { ... }) // This one needs a different configuration
}
Bu tür sınıflar sonsuz daha esnek hale getirir. Başka bir şey yazın sınıfları özellikleri desteği örtülü olmasıdıraramadaha iyi.
Eğer örtülü bir görünümü kullanıyorsanız ilk örnekte, derleyici örtülü bir arama yapmak için:
Function1[Int, ?]
Function1 Yardımcısı nesne ve İnt arkadaşı nesneye bak.
Ölçülebilir olduğuna dikkat edinhiçbir yerdeörtülü arama. Bu paket nesnesi örtük bir görünümü var demektiryakapsam içine alın. Neler olduğunu hatırlamak için daha fazla iş.
Öte yandan, tipi bir sınıftıraçık. Bu yöntemde imza aradığını görürsünüz. Ayrıca, kesin bir arama var
Quantifiable[Int]
Ölçülebilir Yardımcısı nesne olarak görünürveİnt Yardımcısı nesne. Aksaklıklara anlamveyeni tip (Hoşgeldiniz bir sınıf gibi) arkadaşı nesnesindeki varsayılan sağlayabilir ve örtülü olarak aranan olacaktır.
Genel olarak, tip sınıfları kullanıyorum. Sonsuz ilk örneğin daha esnektirler. Örtülü dönüşüm kullandığım tek yer Scala sarıcı ve bir Java API Kütüphanesi arasında bir katman genişleme, ve bu 'tehlikeli' dikkatli olmazsan. olabilir bile.
Datetime veri türü için datetime2 veri...
() sınıf vs türü() Ruby...
Yeni char aslında bir sınıf türü için ...
Nasıl jenerik T türü bir sınıf örneği ...
objective c örtük dönüştürme tamsayı k...