n = 5 def num puts n end
为什么是错的的? 我知道全局和局部基本原理。 局部变量在函数里只能使用,在外部是不存在。
但是在python或js里使用这样方式可以执行的! 还是只有ruby要在函数使用变量需要重新宣告。
请问各位可以解释吗? 谢谢
人生最曼妙的风景,竟是内心的淡定与从容!
def 是打开了一个新的作用域
n = 5 local_variables # => [:n, :_] def num local_variables # => [] end
如果你要访问 n,需要用扁平化作用域
define_method :num do puts n end
@n = 5 def num puts @n end
我也是初学者,看看其它高手怎么说。
但是在python或js里使用这样方式可以执行的!
Python 中是只读
以下是猜想为什么 Ruby 要这么搞?
Ruby 中 def 生成的方法只能访问全局变量。define_method 生成的方法 和 -> (param) {} 或 lambda { |param| } 生成的 proc 带闭包,可以访问外层变量。
def
define_method
-> (param) {}
lambda { |param| }
我猜想是因为 Ruby 认为最常用的情况是你不需要访问外层变量,所以 def 不给你访问了,这样的好处:
function
至于 lambda 带闭包那很正常,都 lambda 了不带闭包说的过去吗?
至于 define_method,猜想是因为
define_method (symbol) { |param| }
define_method(symbol, method)
method
@Andrew_375683 说的是正确的. 主要是作用域的问题 不过这里还有个简单的方法解决将n变成函数就可以了
def n 5 end def num p n end num
这问题火啊。刚刚去趟,回来就几人回答了。
你的代码中的n,你以为是全局变量,可惜不是
irb(main):006:0> x =10 => 10 irb(main):009:0> defined? x => "local-variable"
需要修改就是加个$作为前缀即可:
irb(main):010:0> $x = 1 => 1 irb(main):011:0> defined? $x => "global-variable"
在美好的ruby 风格中 ,$是多么扎眼啊。ruby老板知道全局变量不可缺,但是也怕滥用,因此玩了一个小把戏;)。涉及到的是ruby variables scope 的知识,ruby的优点复杂也与众不同。
@andrewzhyl 说的不错,点赞。
做个笔记:def与def_method的区别:def是用来定义方法的关键字;def_method是一个方法,它的作用是产生一个新方法,def中的代码跟上下文完全隔离的(只认识带@跟美刀的变量);而define_method就显得更加open一点,乐意结识不带任何修饰的小伙伴。
def 是打开了一个新的作用域
如果你要访问 n,需要用扁平化作用域
我也是初学者,看看其它高手怎么说。
Python 中是只读
以下是猜想为什么 Ruby 要这么搞?
Ruby 中
def
生成的方法只能访问全局变量。define_method
生成的方法 和-> (param) {}
或lambda { |param| }
生成的 proc 带闭包,可以访问外层变量。我猜想是因为 Ruby 认为最常用的情况是你不需要访问外层变量,所以
def
不给你访问了,这样的好处:function
头部把体内用到的变量都 undefined 一下,很罗嗦。至于 lambda 带闭包那很正常,都 lambda 了不带闭包说的过去吗?
至于
define_method
,猜想是因为define_method
因为是所谓元编程,有更大机率用外层变量,(本来用元编程就是偷懒少打字,要是不能用外层变量,还要作为参数传入,那累死了。)所以就带闭包。define_method
带闭包啰。define_method
除了define_method (symbol) { |param| }
,还可以写成define_method(symbol, method)
,其中method
比较常用的就是传入一个 lambda,既然传入 lambda,如果本身define_method
除了define_method (symbol) { |param| }
,还可以写成define_method(symbol, method)
,其中method
比较常用的就是传入一个 lambda,既然传入 lambda,如果本身@Andrew_375683 说的是正确的.
主要是作用域的问题
不过这里还有个简单的方法解决将n变成函数就可以了
这问题火啊。刚刚去趟,回来就几人回答了。
你的代码中的n,你以为是全局变量,可惜不是
需要修改就是加个$作为前缀即可:
在美好的ruby 风格中 ,$是多么扎眼啊。ruby老板知道全局变量不可缺,但是也怕滥用,因此玩了一个小把戏;)。涉及到的是ruby variables scope 的知识,ruby的优点复杂也与众不同。
@andrewzhyl 说的不错,点赞。
做个笔记:def与def_method的区别:def是用来定义方法的关键字;def_method是一个方法,它的作用是产生一个新方法,def中的代码跟上下文完全隔离的(只认识带@跟美刀的变量);而define_method就显得更加open一点,乐意结识不带任何修饰的小伙伴。