Ruby delilik: Sınıf Nesnesi vs?
Ben sadece JRuby ile oynamaya başladı. Bu ilk ruby yazıma. Ruby zor bir zaman sınıflar vs nesneleri anlayış vardı. Değil başka bir Nesne yönelimli dil ne sınıflar ve nesneler gibi yani. bir örnek için
Class.is_a? Object
verirdoğru ve
Object.is_a? Object
çok.
sınıf & Nesneyi iki nesne
işte bir tane daha geliyor
Class.is_a? Class
verirdoğru ve
Object.is_a? Class
çok.
dur, daha bitmedi
Object.instance_of? Class
Class.instance_of? Class
Her ikisi de doğrudur
Object.instance_of? Object
Class.instance_of? Object
Her ikisi de yanlış. doğru, hiçbir nesne örneği olabilir.
Ve
Class.kind_of? Class
Object.kind_of? Class
her ikisi de doğrudur
Class.kind_of? Object
Object.kind_of? Object
her ikisi de doğrudur
Her ikisi de tam olarak aynı, neden bu iki var mı.?
Biraz daha kazma sonra, geri dönüş yöntemi için bu basit yöntem, her iki tarafından desteklenen bir liste hazırladım
irb(main):054:0> def print_methods(obj)
irb(main):055:1> obj.methods.each do |mm|
irb(main):056:2* puts mm
irb(main):057:2> end
irb(main):058:1> end
Print_methods(Nesne) ve print_methods(Sınıf) arasında sadece yöntem farkı vardır
Nesting
eğer Yuvalama miras anlamına geliyorsa, Nesne mühürlü sınıfına benzer??
Birisi bunun ne olduğunu bana açıklayacak?
Güncelleme:Yorum Evds
İlginç bir şekilde bu yöntem farklılıkları listesi görüyorum
c=Class.new
print_methods(c)
&
o=Object.new
print_methods(o)
Şimdi Örnek gerçekten sınıfın bir örneğini (bu sınıf örneği aslında bir Nesne) nesne örneği değil anladığım kadarıyla. Ve hatta bu başka bir örneği örnekleri span için bana izin ver
xx = c.new //works - c is an Object / and xx is a instance of an Object c
yy = o.new //nope - o is already a instance of an Object, so it cannot be instantiated again
Sonunda, gerçekten bir Nesne Sınıfının bir örneğidir. Çünkü
xx.is_a? Class
yanlış ama
xx.is_a? Object
true değerini döndürür
Ben? ben?
CEVAP
Temelde önemli olan şey anlamak her sınıfın bir örneği Class
sınıf ve her sınıfın bir alt sınıfı Object
(1.8 - 1.9 her sınıfın bir alt sınıfı BasicObject
). Her sınıf Object
, yani Class
bir sınıfın bir örneği olması anlamında bir nesnedir.
Tabii ki bu Class
kendisi bir örnek olduğu anlamına gelir. Eğer beyninize zarar verirse, bu konuda çok derin düşünme.
Object
Class
is_a? Object
x.is_a? y
x
'y
s class veya x
's sınıfı y
devralır. x.class == y or x.class < y
, yani true
döndürür Her sınıf nesneden devralır beri x.is_a? Object
gerçek x
ne olursa olsun verir. (1.9 1,8 neyse, şimdi devralma hiyerarşisinde en temel sınıf olan da BasicObject
var).
Ayrıca is_a? Class
Object
Class
hem o kadar da şaşırtıcı olmamalı yani gerçekten dersleri alıyor.
Ayrıca instance_of? Class
ama instance_of? Object
.
Eğer x.class
y
bir alt sınıfı ise x.class == y
değil is_a?
, x.instance_of? y
aksine sadece true değerini döndürür. x
y
her iki yana instance_of? Class
, instance_of? Object
değiller.
doğru, hiçbir nesne örneği olabilir.
Bu doğru değil. Object.new.instance_of? Object
doğrudur.
kind_of?
kind_of?
yukarıda is_a?
, bir diğer adıdır.
Her ikisi de tam olarak aynı, neden bu iki var mı.?
Şu ana kadar her şey tüm sınıflar için geçerli olduğunu işaret edilmelidir. E. g. String.is_a? Object
, String.is_a? Class
String.instance_of? Class
doğru ve String.instance_of? Object
yukarıdaki gibi aynı nedenlerle yanlıştır. (String.is_a? String
71* aynı nedenlerle hem de yanlış bir Dize sınıfı, bir dize değil).
Tüm sınıfları aynı olan bu sonuç değil. Sadece aynı sınıfın tüm örnekleri onlar.
Yöntemleri karşılaştırmak
Object
Class
her iki sınıf olduğundan, her ikisi de tüm örnek yöntemleri Class
tarafından tanımlanmış. Class
ayrıca nesting
tek yöntemi vardır. nesting
miras ile ilgisi yok şu anda iç içe olduğunuzu size söyler.
İçin herhangi bir sınıf TheClass.methods
döndürecektir örnek yöntemleri tanımlanmış Class
(örneğin superclass
döndüren, sınıf TheClass
devralır, ve new
yeni bir örneğini oluşturur TheClass
) artı tek yöntem tarafından tanımlanan sınıf.
Neyse methods
doğrudan yöntemler olarak adlandırabileceğimiz belirli bir nesne söyler. Yöntemler bir sınıfın bir örneği olarak adlandırabileceğimiz söylemez. Bunun için Object
ve Class
önemli ölçüde farklı sonuçlar verir instance_methods
kullanabilirsiniz.
Örnek değişken Ruby sınıfa karşı sınıf...
Objective-C sınıf adı NSString nesnesi...
Ruby olmadığını kontrol nesnesi bir Bo...
Python sınıf nesnesi için bir dize dön...
Sınıf ile Raylar form_for seçin sahada...