2010-10-24 9 views
0
class SomeClass 
end 

some_local_var = 5 

sc = SomeClass.new 

def sc.should_work_closure 
    puts some_local_var # how can I access "some_local_var", # doesn't this work like a closure ? 
end 

sc.should_work_closure() 

Ligne 9: en should_work_closure': undefined local variable or method some_local_var » pour # (NameError) de t.rb: 12question de fermeture rubis (ne peut pas accéder à var)

Répondre

0

Non, def ne fonctionne pas comme une fermeture.

Pour faire sc disponible dans le def, vous pouvez faire une constante, la rendre globale (généralement une mauvaise idée) ou utiliser define_method avec un bloc (qui sont des fermetures).

Cependant, puisque vous n'êtes pas dans une classe et que define_method est une méthode pour les classes (et les modules), vous ne pouvez pas simplement l'utiliser. Vous devez utiliser class_eval sur la classe propre sc pour entrer dans la classe.

Exemple:

class <<sc; self end.class_eval 
    define_method(:should_work_closure) 
    puts some_local_var 
    end 
end 

Cela fonctionne, mais il semble un peu effrayant. C'est généralement une mauvaise idée d'accéder aux variables locales de la portée environnante dans les définitions de méthodes.

+1

dans 1.9.2 vous pouvez simplement aller: 'sc.define_singleton_method (: should_work_closure) {puts some_local_var} 1 – horseyguy

+0

Cela semble effrayant, mais ce n'est certainement pas" habituellement est une mauvaise idée d'accéder aux variables locales de l'environnement portée dans les définitions de méthodes ". C'est une chose très commune à faire dans la programmation fonctionnelle. –

+0

@JohnSalvatier Vous comparez des pommes avec des oranges. Ruby n'a pas de définitions de méthodes imbriquées, alors quand nous parlons de "variables locales de la portée environnante", nous parlons de variables locales à l'échelle globale. Nous parlons donc essentiellement de mutable (car si elles n'étaient pas destinées à être mutables, elles seraient définies comme des constantes, auxquelles on peut accéder à partir d'une méthode). Ceux-ci ne sont pas très communs dans la programmation fonctionnelle du tout. – sepp2k

Questions connexes