Aradığım şeyin bir örneği olarak python kullanacağım (Python bilmiyorsanız bunu sözde kod olarak düşünebilirsiniz):
>>> a = 1
>>> type(a)
<type 'int'>
Ruby'de yapabileceğimi biliyorum:
1.9.3p194 :002 > 1.class
=> Fixnum
Ancak nesnenin türünü belirlemenin doğru yolu bu mudur?
Ruby dünyasında sallantılı bir terim olan bir nesnenin "type"'ını belirlemenin doğru yolu object.class
ı çağırmaktır.
Sınıflar diğer sınıflardan miras alabildiğinden, bir nesnenin "belirli bir türden" olup olmadığını belirlemek istiyorsanız, object.is_a?(ClassName)
öğesini çağırarak object
öğesinin ClassName
türünden mi yoksa ondan türetilmiş mi olduğunu görebilirsiniz.
Normalde Ruby'de tip kontrolü yapılmaz, bunun yerine nesneler, genellikle "Duck typing" olarak adlandırılan belirli yöntemlere yanıt verme yeteneklerine göre değerlendirilir. Başka bir deyişle, eğer istediğiniz metotlara cevap veriyorsa, tip konusunda titiz olmaya gerek yoktur.
Örneğin, object.is_a?(String)
çok katıdır, çünkü başka bir sınıf onu bir dizeye dönüştüren yöntemleri uygulayabilir veya String'in davranışıyla aynı şekilde davranmasını sağlayabilir. object.respond_to?(:to_s)`, söz konusu nesnenin istediğiniz şeyi yapıp yapmadığını test etmek için daha iyi bir yol olacaktır.
sen de deneyebilirsin: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Ruby'de çoğu zaman, aslında nesnenin sınıfının ne olduğunu önemsemezsiniz, sadece belirli bir metoda cevap vermesini önemsersiniz. Bu Duck Typing olarak bilinir ve bunu her türlü Ruby kod tabanında görebilirsiniz.
Bu nedenle (çoğu durumda olmasa da) en iyisi #respond_to?(method)
kullanarak Duck Typing kullanmaktır:
object.respond_to?(:to_i)