2017-10-25 9 views
0

私はクラスの動物違いを取得するためにインスタンスを比較し、属性名

class Animal 
    def initialize(a, b, c) 
     @aa=a 
     @bb=b 
     @cc=c 
    end 
end 

を持って、私はこれらのインスタンスを比較しようとしている:

animal_original = Animal.new(1,2,3) 
animal_to_compare = Animal.new(11,2,3) 

私はこれらの2つのインスタンスを比較し、取得するためのメソッドが必要変数の名前と値の違い。

この場合、私はこのようになりaaを含む配列(これは変数の名前です)、最初のオブジェクトの値、及び第二の値が必要になりますが:

["aa", "1", "11"] #returned value 

Iは

def inst_vars obj 
    obj.instance_variables.map do |att| 
     { att => obj.instance_variable_get(att) } 
    end 
    end 

しかし、私は、これを達成することはできません:それは、オブジェクトのすべてのインスタンス変数を取得し、この機能をより簡単に比較するためにマップに変換する実行しようとしました。比較を行い、私が必要とするすべての値を得るには、どうしたらいいですか?

class Animal 
    def initialize(a, b, c) 
    @aa=a 
    @bb=b 
    @cc=c 
    end 

    def inst_vars obj 
    obj.instance_variables.map do |att| 
     [ att, instance_variable_get(att), obj.instance_variable_get(att) ] 
    end.select do |att, one, two| 
     one != two 
    end 
    end 
end 

私は私ができるように与えられた論理の再利用など多くのことを試みてきた。このような何かについてどのように

+0

あなたが有益だと思っている投票の答えを恐れる。コミュニティが良い答えを見つけるのに役立ちます。 –

答えて

0

は、このメソッドを使用してみてください:

def compare_animals(obj1, obj2) 
    out = [] 
    obj1.instance_variables.map do |var|                        
    if obj1.instance_variable_get(var) != obj2.instance_variable_get(var) 
     out << var.to_s.slice(/[^@]./) 
     out << obj1.instance_variable_get(var) 
     out << obj2.instance_variable_get(var) 
    end 
    end 
    out 
end 

あなたはこれでそれを呼び出すことができますいけない

compare_animals animal_original, animal_to_compare 
0

注:これは配列の配列を返します。例えば:

2.4.1 :046 > animal_original = Animal.new(1,2,3) 
=> #<Animal:0x007ffdf718da10 @aa=1, @bb=2, @cc=3> 
2.4.1 :047 > animal_to_compare = Animal.new(11,2,3) 
=> #<Animal:0x007ffdf7119980 @aa=11, @bb=2, @cc=3> 
2.4.1 :048 > animal_original.inst_vars animal_to_compare 
=> [[:@aa, 1, 11]] 

または複数の違いがあります。

2.4.1 :049 > animal1 = Animal.new(1,2,3) 
=> #<Animal:0x007ffdf717ed80 @aa=1, @bb=2, @cc=3> 
2.4.1 :050 > animal2 = Animal.new(1,3,4) 
=> #<Animal:0x007ffdf715c7d0 @aa=1, @bb=3, @cc=4> 
2.4.1 :051 > animal1.inst_vars animal2 
=> [[:@bb, 2, 3], [:@cc, 3, 4]] 
関連する問題