Как мне получить доступ к внешней переменной в замыкании в ruby? - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть следующий динамически созданный класс, который передается в функцию xpath nokogiri:

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 ]

4 голосов
/ 15 ноября 2010

Методы не могут быть замыканиями в 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 голос
/ 15 ноября 2010

Вы можете сделать это так:

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

С eval это выглядит не очень хорошо, но работает =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...