2010-10-24 50 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() 

9号线:在should_work_closure': undefined local variable or method some_local_var”为#(NameError) 从t.rb:12红宝石关闭问题(无法访问VAR)

回答

0

不,def不工作就像一个闭合。

要在def可用sc你可以把一个常数,使其全球(通常是一个坏主意),或使用define_method与块(这是闭包)。

但是,由于您不在课堂内,define_method是类(和模块)的一种方法,因此您不能只使用它。您必须在sc的特征类上使用class_eval才能进入课程。

例子:

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

这是可行的,但它看起来有点吓人。在方法定义中访问周围范围的局部变量通常是一个坏主意。

+1

in 1.9.2你可以简单地去:'sc.define_singleton_method(:should_work_closure){puts some_local_var} 1 – horseyguy 2010-10-24 12:20:31

+0

看起来很可怕,但它肯定不是“通常从周围访问局部变量是个好主意范围在方法定义中“。在函数式编程中这是一个超常见的事情。 – 2013-05-09 01:15:00

+0

@JohnSalvatier你在比较苹果和橘子。 Ruby没有嵌套的方法定义,所以当我们谈论“来自周边范围的局部变量”时,我们在全局范围内讨论局部变量。所以我们基本上是在讨论mutable(因为如果它们不是可变的,它们将被定义为常量,可以从一个方法中访问*)全局变量。这些在函数式编程中并不常见。 – sepp2k 2013-05-09 11:50:49