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

第二个和第三个块需要从第一个块/方法定义的所有变量。但是我如何传递所有这些变量?我读过的一个例子建议我将它们全部作为参数传递,例如:

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

但这与在两个块中定义每个变量两次一样混乱。处理这种情况的简单、干燥的方法是什么?如果我需要澄清我的问题中的任何内容,请告诉我,谢谢。

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

绝对使用 struct 的方法是最好的方法之一。

你也可以这样做:

这里是龙,不要在家里尝试!:)

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 回答