SORU
15 Aralık 2011, PERŞEMBE


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
16 Aralık 2011, Cuma


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.

  1. Oluşturma/kısa devre Kapsamı içinde örtülü örneği arama sınıf örtülü bir tür alma
  2. 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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • VJ VIMANA

    VJ VIMANA

    3 Mayıs 2007