0

これを正確に表現する方法はわかりませんが、多くの変数を定義してから、多くの変数のそれぞれを書き直したり、新しいブロックごとに冗長なコードを作成したりせずに、それらを再定義しようとしています。変数は、複数のデータベースからの配列要素を定義しています。これが私が扱っているものの縮小されたサンプルです:

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

2番目と3番目のブロックには、最初のブロック/メソッドから定義されたすべての変数が必要です。しかし、どうすればこれらすべての変数を渡すことができますか?私が読んだ1つの例は、それらすべてを次のようなパラメーターとして渡すことを提案しました。

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

しかし、これは、両方のブロックで各変数を2回定義するのと同じくらい混乱します。そのような状況への単純で乾いたアプローチは何ですか?質問で何か明確にする必要がある場合はお知らせください。ありがとうございます。

4

2 に答える 2

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
于 2012-04-26T06:21:50.987 に答える
0

構造体を使用したアプローチは間違いなく最高の1つです。

また、あなたはそのようなことをすることができます:

ここにドラゴンがいます、家でそれを試さないでください!:)

class Foo

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

    binding
  end

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

end

foo = Foo.new
foo.bar

詳細については、rubyのbinding http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdocに関するこの素敵なブログ投稿を確認してください。

于 2012-04-26T07:43:56.480 に答える