我现在正在学习ruby.我试图了解闭包的工作方式,以及它们与函数的区别.我完全知道闭包应该通过proc或lambda来实现. 我想要深入了解ruby.因此,我检查各种非正统的代码.我试图理解为什么
我想要深入了解ruby.因此,我检查各种非正统的代码.我试图理解为什么第3行工作而第5行是错误.
x=123 def b(x) p x def a(u) p x # why is this an error?!?!? end a 4 end b 1
>如果a无法访问b的参数,为什么不访问全局x = 123?
>如果我明确使用更改行1& 5到全球“$x”?
>如果我明确地使用lambda,为什么这会起作用?
这纯粹是一个学习练习,我这样做是为了了解幕后发生的事情.
这就是所谓的“范围门”.基本上,当您开始定义方法/类/模块时,会创建一个新范围,并且无法访问其他范围内的所有局部变量.这不适用于实例/全局变量,您将继续访问这些变量.由于lambda不是方法,因此它不会创建新范围并重新使用现有范围.
也,
why line 3 works
x = 123 def b(x) p x # this "x" is "x the parameter", not "x the local variable from outer scope" # that's why it works. If you tried to access the local var, it wouldn't work. def a(u) p x # like here, see? Doesn't work. end a 4 end b 1