2016-05-13 3 views
2

私は、initializeメソッドがいくつかのインスタンス変数を定義し、いくつかの計算を行うクラスを持っています。そのクラスの約60個のオブジェクトを作成する必要があります。各オブジェクトには、最後にID番号が付いています。例:すべて手で定義することはできますが、それは非常に非効率的です。各オブジェクトを動的に作成する方法はありますか?Rubyでオブジェクトを動的に作成する

+0

ただ配列にそれらをプッシュすることができます。あなたはそれを試しましたか?同様に:** objs = Array.new **、次に新しいインスタンスごとに** objs.push(Dynamic.new(x、y))**を実行します。 –

+1

これは、各インスタンスを配列内のインデックスに関連付けることになります。これは、変数名にIDを持つことと全く同じです。 –

+1

「各オブジェクトには最後にID番号があります」という意味がはっきりしません。 – sawa

答えて

2

いつでもループを作成して、すべてのオブジェクトを配列にプッシュできます。どのオブジェクトがそれぞれであるかを知るには、配列の位置が必要な場合もあります。これはあなたが望んでいたものではありませんが(少なくとも私はそうは思わない)、十分であるはずです。

class Dynamic 
@@instances_of_class = 0 
    def initialize(x,y) 
    #... 
    @array_position = @@instances_of_class 
    @@instances_of_class += 1 
    end 
end 

ary = [] 
50.times do 
ary << Dynamic.new(x,y) 
end 

編集:このソリューションあなたは、配列を変更した場合、コメントで言ったように、ので、ここで別の解決策だ、バグを引き起こす可能性があります。

File.rbの内部には、使用できる一意の名前付き変数が50個あります。

+0

この溶液は非常に脆い。 'ary'をうまく作成できますが、次に何ができますか?さて、あなたは最初の要素を 'ary'から削除します - ああ、すべての' @ array_position'は間違っています。とにかく潜在的なバグを導入せずに 'ary'を変更することはできません。では、なぜこの答えは受け入れられますか? @Jonthemanman – TeWu

+0

@ Tee - 私は(私は)私の最初のものより優れていると思う別のソリューションを追加しました。楽しい。 :) – TheLuigi

-1

変数から60個のオブジェクトにアクセスできるようにするには、それらを1つの変数で参照される配列に配置する必要があります。

objects = Array.new(60){Dynamic.new(x, y)} 

あなたobject1object2、...、objects[0]objects[1]に対応させていただきます...それぞれ。

+1

これははるかに良い答えです。それでなぜ受け入れられるのではなく、それを下降させたのですか?この答えに何か問題がありますか?私はそれを見ていませんか? – TeWu

1

私はなぜあなたがこれを必要としているのか分かりません。それは珍しい要求です。それは、問題を解決するのではなく、問題を回避できることを意味します。 TheLuigiのソリューションはうまくいくと思いますが、クラス変数を使用すると、これらのIDは複数のクラスにまたがって共有されます。代わりに、次のようなものでインスタンス変数を使用することができます:

class A 
    def self.next_id 
    @id ||= 0 ; @id += 1 
    end 

    def initialize 
    @id = A.next_id 
    end 
end 

A.new 
# => #<A:0x007fd6d414c640 @id=1> 
A.new 
# => #<A:0x007fd6d41454a8 @id=2> 
関連する問題