2010-11-26 13 views
3

Rubyでは、任意のメソッドを使用して、オブジェクトoがクラス階層にクラスCをその祖先として持つかどうかを識別できますか?Ruby:オブジェクトoがクラス階層を祖先として持つクラスCを持っているかどうかをどうやって識別しますか?

ここでは、仮想的な方法has_super_class?を使用してここでは例を挙げています。実際にこれをどうすればいいですか?

o = Array.new 
o[0] = 0.5 
o[1] = 1 
o[2] = "This is good" 
o[3] = Hash.new 

o.each do |value| 
    if (value.has_super_class? Numeric) 
    puts "Number" 
    elsif (value.has_super_class? String) 
    puts "String" 
    else 
    puts "Useless" 
    end 
end 

予想される出力:

Number 
Number 
String 
Useless 

答えて

8

を使用します:この(singletone方法など)のような

1.kind_of?(Fixnum) => true 
1.kind_of?(Numeric) => true 
.... 
1.kind_of?(Kernel) => true 

kind_of?方法も同じ代替is_a?を持っています。

あなたは、オブジェクトがクラスの(直接の)インスタンスであるかどうかだけをチェックobj.instance_of?を使用する場合:

1.instance_of?(Fixnum) => true 
1.instance_of?(Numeric) => false 
.... 
1.instance_of?(Kernel) => false 

また、そのclassancestorsメソッドを呼び出すことにより、オブジェクトのすべての先祖を一覧表示することができます。たとえば1.class.ancestors[Fixnum, Integer, Precision, Numeric, Comparable, Object, PP::ObjectMixin, Kernel]です。

0
o.class.ancestors 

そのリストを使用して、我々はhas_super_classを実装することができますか?

def o.has_super_class?(sc) 
    self.class.ancestors.include? sc 
end 
3

だけobj.kind_of?(Klassname)を試してみてください.is_a?

o = [0.5, 1, "This is good", {}] 

o.each do |value| 
    if (value.is_a? Numeric) 
    puts "Number" 
    elsif (value.is_a? String) 
    puts "String" 
    else 
    puts "Useless" 
    end 
end 

# => 
Number 
Number 
String 
Useless 
0

RAD方法:

is_a = Proc.new do |obj, ancestor| 
    a = { 
    -1 => "#{ancestor.name} is an ancestor of #{obj}", 
    0 => "#{obj} is a #{ancestor.name}", 
    nil => "#{obj} is not a #{ancestor.name}", 
    } 
    a[obj.class<=>ancestor] 
end 

is_a.call(1, Numeric) => "Numeric is an ancestor of 1" 
is_a.call(1, Array) => "1 is not a Array" 
is_a.call(1, Fixnum) => "1 is a Fixnum" 

1.class.ancestors => [Fixnum, Integer, Numeric, Comparable, Object, Kernel, BasicObject] 
1.class <= Fixnum => true 
1.class <= Numeric => true 
1.class >= Numeric => false 
1.class <= Array => nil 

あなたはそれで空想になりたい場合は、このような何かを行うことができます

関連する問題