3

私は今日 Ruby を学び始めたばかりで、クラ​​スを作成し、そのクラスに属するオブジェクトを作成することを学びました。上記のクラスで作成したインスタンスの名前をすべて取得する方法があるかどうかを知りたいです。元)

class Clothes
  attr_accessor:color
end

shirt=Clothes.new
#=> #<Clothes:0x007f89208cd330> 
pants=Clothes.new
#=> #<Clothes:0x007f89208c18f0> 
socks=Clothes.new
#=> #<Clothes:0x007f8920861748> 

服クラス (シャツ、パンツ、靴下) に属するすべてのオブジェクトを、指​​定した名前で一覧表示するコマンドはありますか? ありがとう!

4

5 に答える 5

2

免責事項:あなたがやろうとしていることは、おそらくもっとエレガントに解決できます。

覚えておきたいオブジェクトを配列に格納するだけです。それにもかかわらず、ここにあなたの質問に対する解決策があります:

local_variables.select{|v| eval(v.to_s).class == Clothes }
#=> [:socks, :pants, :shirt]
于 2013-02-27T21:13:50.050 に答える
1

クラス変数を使用してすべてのインスタンスの名前を収集し、初期化メソッドで何らかのシンボルを渡すことをお勧めします。

class Clothes
    attr_accessor :color

    @@instances = []
    def initialize(name)
        @@instances << name
    end

    def all
       puts @@instances
    end
end

shirt = Clothes.new(:shirt)
pants = Clothes.new(:pants)

puts pants.all
# outputs the names
于 2013-02-27T21:55:24.693 に答える
0

いいえ、ありません。ただし、newメソッドを変更して、このクラスのすべての新しいインスタンスをクラス変数に格納することにより、同様のことを実現できます。これにより、このクラスのすべてのオブジェクトに簡単にアクセスできますが、変数名にはアクセスできません (とにかく必要性がわかりません)。

于 2013-02-27T21:02:30.117 に答える
0

インスタンス変数でそれを行うことができます:

class Clothes; end
@a = Clothes.new
@b = Clothes.new
@c = 1

p instance_variables.select{|v|instance_variable_get(v).class == Clothes}
#=>[:@a, :@b]
于 2013-02-27T21:13:57.373 に答える
0

ruby ObjectSpaceを使用して、クラスのすべてのインスタンス/オブジェクトを収集できますeach_objectメソッドがこれを行うのに役立ちます

例えば

all = []
ObjectSpace.each_object Clothes {|cloth| all << cloth }
于 2013-02-27T21:04:54.633 に答える