ruby - 在 Ruby 中定义使用范围外变量的方法

标签 ruby metaprogramming closures

我想创建一个 Test::Unit test_helper 方法,我可以在测试执行后调用它来删除一堆表。这是我的总体想法:

def self.wipe_models(*models)
  def teardown
    models.each do |model|
      model = model.to_s.camelize.constantize
      model.connection.execute "delete from #{model.table_name}"
    end
  end
end

但是,当 teardown 运行时,我得到:

undefined local variable or method `models'

在我看来,“def” block 似乎不遵守通常的闭包规则;我无法访问在其范围之外定义的变量。

那么,如何访问在“def”方法声明之外定义的变量?

最佳答案

您可以使用 define_method 将其作为闭包来完成:

def self.wipe_models(*models)
  define_method(:teardown) do
    models.each do |model|
      model = model.to_s.camelize.constantize
      model.connection.execute "delete from #{model.table_name}"
    end
  end
end

现在方法体是一个 block ,可以访问models

关于ruby - 在 Ruby 中定义使用范围外变量的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938931/

相关文章:

html - 根据屏幕尺寸更改 Bootstrap 网格元素填充

ruby - 将所有客户从 Stripe API 检索到一个列表中的最佳做法是什么

linux - 如何创建新的 Sqlite 元命令

ruby - 在运行时向 Ruby 类添加类实例变量和 attr_reader?

ios - 将数组中的闭包/ block 作为参数传递 iOS

javascript - 单击循环内的事件关闭

javascript - JavaScript 闭包内存效率高吗?

ruby - 在 Ruby 中使用 return 不是惯用的吗?

ruby-on-rails - 当我需要模型关系时,我如何防止错误?

javascript - 在 Javascript/Coffeescript/jQuery 中是否有与 Ruby 的发送等效的东西?