我在if块内进行赋值操作,发现了以下结果,这令我感到惊讶:C:\>irb --simple-promptif falsex = 10end#=> nilp xnilx.object_id#=> 4#=> nilp yNameError: undefined local variable or method `y' for main:Object from (irb):5 from C:/Ruby193/bin/irb:12:in `<main>'在上面的代码中,您可以看到x即使仅在falsy if块中将其分配给了局部变量,该局部变量仍已创建。我想看到的内容x与p x这迫使我相信,分配却没有这样做,而是x变量存在。x.object_id也证明是这种情况。现在我的问题是,x即使if有意永久关闭块入口点,也如何创建该局部变量?我期望的输出p x类似于的输出p y。但是相反,我得到了一个令人惊讶的答案p x。有人可以向我解释这个概念如何运作吗?编辑不,这是另一个测试。仅local变量不是这种情况。instance和class变量也发生了同样的情况。见下面:class Foo def show @X = 10 if false p @X,"hi",@X.object_id endend#=> nilFoo.new.shownil"hi"4#=> [nil, "hi", 4]class Foo def self.show @@X = 10 if false p @@X,"hi",@@X.object_id endend#=> nilFoo.shownil"hi"4#=> [nil, "hi", 4]成功案例:class Foo def self.show @@X = 10 if true p @@X,"hi",@@X.object_id endend#=> nilFoo.show10"hi"4#=> [10, "hi", 4]
3 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
Ruby具有局部变量“提升”。如果在方法中的任何地方都对局部变量进行了赋值,则该变量在方法中的任何地方都存在,甚至在赋值之前,甚至从未真正执行过赋值。在分配变量之前,其值为nil。
编辑:
以上不是很正确。Ruby确实有一种变量提升的形式,即当存在局部变量赋值但不执行时,它将定义一个局部变量。但是,在上述方法中发生赋值的点上找不到该变量。
- 3 回答
- 0 关注
- 510 浏览
添加回答
举报
0/150
提交
取消