2010-11-15 5 views
2

J'ai la suivante classe dynamique créée qui est passé dans la fonction XPath de nokogiri:Comment avoir accès à une variable externe dans une fermeture en rubis?

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) 

Je voudrais accéder d'une manière ou définir la variable de pays ou avoir accès à l'auto extérieur à l'intérieur de la fonction regex.

Y at-il de toute façon je peux passer le soi extérieur dans l'expression Class.new ou quelqu'un peut-il suggérer un meilleur moyen?

Répondre

4

Les méthodes ne peuvent être des fermetures en Ruby, seuls les blocs peuvent:

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) 

Par ailleurs: votre méthode regex est beaucoup plus compliqué que cela doit être. Il est tout simplement équivalent à

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

Vous pouvez le faire comme ceci:

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

Il ne semble pas très agréable avec eval mais cela fonctionne =)

Questions connexes