SORU
27 EKİM 2009, Salı


Neden't eigenclass çok benzeyen bu zaman self.class eşdeğer değil mi?

Bir yere not özledim, ve bunu bana izah edersin umarım.

Neden bir nesne self.class farklı eigenclass?

class Foo
  def initialize(symbol)
    eigenclass = class << self
      self
    end
    eigenclass.class_eval do
      attr_accessor symbol
    end
  end
end

class.self ile eigenclass bir tutan mantık zincirimi oldukça basittir:

class << self Sınıf yöntemleri yerine, örnek yöntemleri bildirmek için bir yoldur. def Foo.bar bir kısayol.

Sınıf nesnesine başvuru içinde, self dönen 10 ** aynı olmalıdır. Bu class << self sınıf yöntemleri/özellikler tanımı Foo.class 12 *set olmasıdır.

Sadece ben şaşkın mıyım? Ya da, bu Yakut sinsi bir hile meta-programlama?

CEVAP
27 EKİM 2009, Salı


class << self sınıf yöntemleri bu şekilde kullanılabilir olsa) ilan sadece bir yol daha vardır. Muhtemelen bazı kullanım gibi gördüm:

class Foo
  class << self
    def a
      print "I could also have been defined as def Foo.a."
    end
  end
end

Bu çalışır ve def Foo.a eşdeğer ama çalışma şekli biraz ince. Gizli self Bu bağlamda, nesne anlamına gelir. Class benzersiz, anonim bir alt sınıfı olan Foo,. Bu alt 20 **'ler denireigenclass. def a yeni bir yöntem a denilen oluşturur bu yüzden Foo'In eigenclass, normal yöntem çağrısı sözdizimi tarafından erişilebilir: Foo.a.

Şimdi farklı bir örneğe bakalım:

str = "abc"
other_str = "def"

class << str
  def frob
    return self   "d"
  end
end

print str.frob # => "abcd"
print other_str.frob # => raises an exception, 'frob' is not defined on other_str

Bu örnek, ilk başta söylemek zor olsa da aynı zamanda. frob, str, String eşsiz bir anonim sınıfının eigenclass String sınıf değil, ama tanımlanır. str frob bir yöntemi vardır, ama genel olarak String örnekleri. Ayrıca Dize geçersiz kılınmış yöntemler () bazı zor test senaryoları çok yararlı olabilir.

Şimdi orijinal örnek anlamak için donanımlı değiliz. Foo'nın başlatma yöntemi, self bazı özel ders 35 ** değil, ama anlamına gelir . içinde ^em>örnekFoo. Onun eigenclass Foo, bir alt sınıfıdır ama Foo; olamaz, yoksa ikinci örnekte gördüğümüz hile işe yaramaz değildir. Örnek devam etmek için:

f1 = Foo.new(:weasels)
f2 = Foo.new(:monkeys)

f1.weasels = 4 # Fine
f2.monkeys = 5 # Also ok
print(f1.monkeys) # Doesn't work, f1 doesn't have a 'monkeys' method.

Bu yardımcı olur umarım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Artorius FullPower

    Artorius Ful

    29 Temmuz 2007
  • iNCH

    iNCH

    20 Temmuz 2009
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007