SORU
11 ŞUBAT 2011, Cuma


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
11 ŞUBAT 2011, Cuma


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • newreleaseblitz

    newreleasebl

    13 Ocak 2010