2012-04-26 78 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 2012-04-26 18:06:00

0

绝对方法与结构是最好的之一。

而且你可以做这样的事情:

这里作野狗,不要尝试在家里! :)

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 

有关详细信息,你可以检查这个漂亮的博客文章关于Ruby的bindinghttp://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

+0

感谢您的资源。很有帮助。 – rubyuser1357796 2012-04-26 18:06:24

+0

没有问题,但请保证我不会在你的应用程序中使用'binding'技术;) – luacassus 2012-04-26 19:02:50

相关问题