2012-04-26 16 views
0

どのように正確にこれを言いたいのか分かりませんが、多くの変数を定義して、多くの変数をそれぞれ書き直したり、新しいブロックごとに冗長コードを作成したりせずに再定義しようとしています。変数は、複数のデータベースから配列要素を定義しています。ここで私が働いているものを小型化したサンプルです:Ruby:(再)別のブロック/メソッドから変数を定義していますか?

def lots_of_vars(array) 
    name = array[1] 
    membership = array[2] 
    spouse = array[3] 
    .... 
    lap12 = array[36] 
end 

def second_block 
    #database1 => [ "Randy", true, "Nancy", 2, 17, false... 
    lots_of_vars(database1) 
    return unless membership 
    puts "Lap progress for #{name} and #{spouse}: #{lap1}, #{lap2}... #{lap12}..." 
end 

def third_block 
    #database2 => [ "Steven", true, nil, 0, 5, false... 
    lots_of_vars(database2) 
    return unless spouse.empty? or spouse.nil? 
    puts "Weekly progress for #{name}: #{lap1}, #{lap5}, #{lap6}, #{lap10}..." 
end 

第二と第三のブロック最初のブロック/メソッドから定義されているすべての変数を必要としています。しかし、どのようにこれらの変数をすべて渡すのですか?

def second_block(name, membership, spouse...) 

が、これは両方のブロックに二回、各変数の定義など、混乱の同じくらいになるだろう:私が読ん一つの例は、私のようなパラメータとしてそれらすべてを渡す示唆しました。このような状況に対して、単純で乾いたアプローチは何ですか? 私の質問で何かを明確にする必要がある場合はお知らせください、ありがとうございます。

答えて

3

あなたが望むのは、データ構造を表す簡単なクラスであるStructを作成することです。あなたがメソッド呼び出し(引数リストの中に配列を回す)

確かにそう

Thing = Struct.new(:name, :membership, :spouse, :lap12) 

array = ['Larry', 'gold', 'Sue', 2.2] 
thing = Thing.new(*array) 

#note that the splat (*) is equivalent to saying 
# Thing.new(array[0], array[1], array[2], array[3]) 

thing.name # => "Larry" 
thing.lap12 # => 2.2 
+0

おかげについては、この素敵なブログ記事をチェックすることができ、必要に応じて、これは正確に働きました。 – rubyuser1357796

0

アプローチに配列をスプラットことができるので、構造体は、正確に何をしたいの位置によってでその引数を取りますstructは最高のものの1つです。

また、あなたがそのようなこと行うことができます:HERE

をDRAGONS BE、自宅でそれをしようとしないでください!詳細については:)

class Foo 

    def lots_of_vars(array) 
    name = array[0] 
    email = array[1] 
    description = array[2] 

    binding 
    end 

    def bar 
    array = ['Luke', '[email protected]', 'Lorem ipsum'] 
    eval('"My name is #{name}, email: #{email}, here is description: #{description}"', lots_of_vars(array)) 
    end 

end 

foo = Foo.new 
foo.bar 

あなたはルビーのbindinghttp://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

+0

リソースをありがとう。非常に役立ちます。 – rubyuser1357796

+0

問題はありませんが、アプリケーションで 'binding'テクニックを使用しないことを約束してください;) – luacassus

関連する問題