84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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
不带闭包,那就会很违和的说,所以就让它带啰。@Andrew_375683 说的是正确的.
主要是作用域的问题
不过这里还有个简单的方法解决将n变成函数就可以了
这问题火啊。刚刚去趟,回来就几人回答了。
你的代码中的n,你以为是全局变量,可惜不是
需要修改就是加个$作为前缀即可:
在美好的ruby 风格中 ,$是多么扎眼啊。ruby老板知道全局变量不可缺,但是也怕滥用,因此玩了一个小把戏;)。涉及到的是ruby variables scope 的知识,ruby的优点复杂也与众不同。
@andrewzhyl 说的不错,点赞。
做个笔记:def与def_method的区别:def是用来定义方法的关键字;def_method是一个方法,它的作用是产生一个新方法,def中的代码跟上下文完全隔离的(只认识带@跟美刀的变量);而define_method就显得更加open一点,乐意结识不带任何修饰的小伙伴。