Fark ne? Hangisini ne zaman kullanmalıyım? Neden bu kadar çok var?
Fark ne? Hangisini ne zaman kullanmalıyım? Neden bu kadar çok var?
Yanıtlar:
kind_of?
ve is_a?
eşanlamlıdır.
instance_of?
diğer ikisinden farklıdır, çünkü yalnızca true
nesne bir alt sınıf değil, tam sınıfın bir örneğiyse döner .
Misal:
"hello".is_a? Object
ve "hello".kind_of? Object
dönüş true
çünkü "hello"
bir String
ve String
bir alt sınıfıdır Object
."hello".instance_of? Object
geri döner false
.@honda.kind_of? Car
ve @person.is_a? Administrator
Ruby'nin estetiğe dair her şeyi. Aslında, dilbilgisi hatasına dikkat edin ... aktif destekle şunları yazabilirsiniz:) @person.is_an? Administrator
... Bu şimdiye kadar Ruby çekirdeğine dönüşmüş olabilir aslında.
kind_of?
ama değil is_a?
mi?
is_an?
ruby-1.9.2-p0 içinde değil. @Claudiu, hayır. is_a?
sadece bir takma addırkind_of?
. Her iki yöntem de aynı c işlevini çağırır rb_obj_is_kind_of
.
kind_of?
kılmadan geçersiz kılabilirsiniz is_a?
.
is_an?
yöntemi nerede ?! Mevcut raylar sürümünde değil ve google'da da kullanımdan kaldırıldığına dair bir şey bulamıyorum.
Fark ne?
Belgelerden:
- - ( Boole )
instance_of?(class)
- Verilen sınıfın bir örneği olup
true
olmadığını döndürürobj
.
ve:
- - ( Boolean )
is_a?(class)
- ( Boolean )kind_of?(class)
- Sınıfının veya sınıfının üst sınıflarından veya modüllerinden birinin sınıfı olup
true
olmadığını döndürür .class
obj
class
obj
obj
Bu net değilse, tam olarak neyin belirsiz olduğunu bilmek güzel olur , böylece dokümantasyon iyileştirilebilir.
Hangisini ne zaman kullanmalıyım?
Asla. Bunun yerine polimorfizm kullanın.
Neden bu kadar çok var?
Ben iki "çok" demezdim. İki tane var, çünkü iki farklı şey yapıyorlar.
Nesneleri kullanarak ihtiyacınız olan bir yönteme yanıt verip vermediklerini sormak Ruby'ye daha benzerdir respond_to?
. Bu, hem minimal arayüz hem de uygulamadan habersiz programlama sağlar.
Tabii ki her zaman uygulanamaz, bu nedenle, sorduğunuz yöntemleri kullanarak, sınıf veya temel sınıf olan "tip" in daha muhafazakar bir şekilde anlaşılmasını isteme olasılığı vardır.
Ayrıca iki tane çok çağırmam ( is_a?
ve kind_of?
aynı yöntemin takma adları), ancak daha fazla olasılık görmek istiyorsanız, dikkatinizi #class
yönteme çevirin :
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
is_a?
vekind_of?
vardır: Ben Ruby'nin tasarım felsefesi 's kısmını varsayalım. Python, bir şey yapmanın tek bir yolu olması gerektiğini söylerdi; Ruby genellikle eşanlamlı yöntemlere sahiptir, böylece daha iyi görünen yöntemi kullanabilirsiniz. Bu bir tercih meselesi. Kısmen Japon etkisinden kaynaklanıyor olabilir: Güzel görünmesi için cümle bağlı olarak aynı sayı için farklı bir kelime kullanacakları söylendi. Matz bu fikri dil tasarımına taşımış olabilir.