为了账号安全,请及时绑定邮箱和手机立即绑定

虚假的“ if”块中的赋值操作令人困惑

虚假的“ if”块中的赋值操作令人困惑

慕尼黑5688855 2019-10-22 21:22:22
我在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 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

Ruby总是解析所有代码。它不会将false视为不解析内部内容的标志,它会对其进行评估并发现不应执行内部代码


查看完整回答
反对 回复 2019-10-22
?
12345678_0001

TA贡献1802条经验 获得超5个赞

Ruby具有局部变量“提升”。如果在方法中的任何地方都对局部变量进行了赋值,则该变量在方法中的任何地方都存在,甚至在赋值之前,甚至从未真正执行过赋值。在分配变量之前,其值为nil。


编辑:


以上不是很正确。Ruby确实有一种变量提升的形式,即当存在局部变量赋值但不执行时,它将定义一个局部变量。但是,在上述方法中发生赋值的点上找不到该变量。


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 510 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信