如何在ruby的闭包中访问外部变量?

时间:2010-11-15 12:21:54

标签: ruby

我有以下动态创建的类,它被传递到nokogiri的xpath函数中:

country = nil

ret = parent.xpath(".//text()[regex(.)]", Class.new{
  def regex(node_set, lead)
    result = node_set.find_all do |node|
      node.text =~ POST_CODE_EXPRESSION || node.text =~ ZIP_CODE_EXPRESSION
    end
    result
  end
}.new)

我想以某种方式访问​​或设置国家/地区变量或从正则表达式函数中访问外部自我。

无论如何,我可以将外部自我传递给Class.new表达式,还是有人可以提出更好的方法?

2 个答案:

答案 0 :(得分:4)

方法不能是Ruby中的闭包,只有块可以:

country = nil

ret = parent.xpath(".//text()[regex(.)]", Class.new{
  define_method(:regex) do |node_set, lead|
    result = node_set.find_all do |node|
      node.text =~ POST_CODE_EXPRESSION || node.text =~ ZIP_CODE_EXPRESSION
    end
    result
  end
}.new)

顺便说一下:你的regex方法比它需要的要复杂得多。它只相当于

define_method(:regex) do |node_set, lead|
  node_set.find_all do |node|
    node.text =~ POST_CODE_EXPRESSION || node.text =~ ZIP_CODE_EXPRESSION
  end
end

答案 1 :(得分:1)

你可以这样做:

x = 1
Class.new do
  def initialize(binding)
    eval 'x += 1', binding
  end
end.new binding
p x # will print 2

使用eval看起来不太好但是它可以工作=)