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
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.
Daha önce bir şey yineleme zaman bu ko...
Neden Chrome, diğer tarayıcılar't...
Neden değil't son bir değişken he...
Neden sabit C , değil zaman içinde iç ...
Neden't GCC*****a (**)*(**) optim...