【问题标题】:Ruby: (re)defining variables from another block/method?Ruby:(重新)从另一个块/方法定义变量?
【发布时间】:2012-04-26 06:04:20
【问题描述】:

我不知道该怎么说,但我正在尝试定义许多变量,然后重新定义它们,而不需要重写许多变量中的每一个,并在我编写的每个新块中创建冗余代码。变量定义来自多个数据库的数组元素。这是我正在使用的缩小样本:

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...)

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您想要的是创建一个 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
    

    【讨论】:

      【解决方案2】:

      使用 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

      【讨论】:

      • 感谢您的资源。很有帮助。
      • 没问题,但请向我保证,您不会在您的应用程序中使用binding 技术;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多