我不知道怎么说这个,但是我试图定义很多变量,然后重新定义它们而不重写每个变量,并在我写的每个新块中创建冗余代码。变量是从多个数据库定义数组元素。以下是我正在使用的缩小样本:
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...)
但这会在两个块中两次定义每个变量时造成混乱。这种情况的简单干燥方法是什么? 如果我需要澄清我的问题,请告诉我,谢谢。
答案 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