SORU
25 ŞUBAT 2012, CUMARTESİ


Bu nedir `#` operatör Scala için ne ifade ediyor?

Bu blog bu kodu görüyorum: Type-Level Programming in Scala:

// define the abstract types and bounds
trait Recurse {
  type Next <: Recurse
  // this is the recursive function definition
  type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
  type Next = RecurseA
  // this is the implementation
  type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
  // infinite loop
  type C = RecurseA#X[RecurseA]
}

Daha önce hiç görmediğim bir operatör kodu # R#X[R#Next] var. Zor kim söyleyebilir(arama motorları tarafından dikkate alınmaz) arama, o zamandan beri ne anlama geliyor?

CEVAP
25 ŞUBAT 2012, CUMARTESİ


Bunu açıklamak için, öncelikle Scala iç içe sınıflar açıklamak zorunda. Bu basit bir örneği ele alalım

class A {
  class B

  def f(b: B) = println("Got my B!")
}

Şimdi onunla bir şeyler deneyin:

scala> val a1 = new A
a1: A = A@2fa8ecf4

scala> val a2 = new A
a2: A = A@4bed4c8

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

Scala başka bir sınıf içinde bir sınıf bildirirken, " diyorsunuzher örneğibu sınıfın büyük bir alt sınıfı. Diğer bir deyişle, A.B sınıf yok, ama a1.B a2.B sınıf var, ve onlarfarklıyukarıdaki hata iletisi bize anlatıyor sınıflar,.

Eğer aklınızı kullanıyorsanız, yolu bağımlı türlerini aramak.

Şimdi, # belirli bir örnek için kısıtlama olmadan böyle iç içe geçmiş sınıflar başvurmak için yapar. Diğer bir deyişle, A.B ama B iç içe geçmiş bir sınıf anlamına gelir A#B var hayır yokherhangi birA örneği.

İş bu yukarıdaki kodu değiştirerek görebiliriz:

class A {
  class B

  def f(b: B) = println("Got my B!")
  def g(b: A#B) = println("Got a B.")
}

Ve onu deniyorum:

scala> val a1 = new A
a1: A = A@1497b7b1

scala> val a2 = new A
a2: A = A@2607c28c

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

scala> a2.g(new a1.B)
Got a B.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Film Riot

    Film Riot

    16 NİSAN 2006
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006