Ruby :(重新)定义另一个块/方法的变量?

时间:2012-04-26 06:04:20

标签: 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...)

但这会在两个块中两次定义每个变量时造成混乱。这种情况的简单干燥方法是什么? 如果我需要澄清我的问题,请告诉我,谢谢。

2 个答案:

答案 0 :(得分:3)

您想要的是创建一个Struct,它是一个表示数据结构的简单类。结构将按位置获取其参数,这正是您想要的,因为您可以将数组splat到方法调用中(将数组转换为参数列表)

所以

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

答案 1 :(得分: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

的好文章。