猿问

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

我在if块内进行赋值操作,发现了以下结果,这令我感到惊讶:


C:\>irb --simple-prompt

if false

x = 10

end

#=> nil

p x

nil

x.object_id

#=> 4

#=> nil

p y

NameError: 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

  end

end

#=> nil

Foo.new.show

nil

"hi"

4

#=> [nil, "hi", 4]


class Foo

  def self.show

    @@X = 10 if false

    p @@X,"hi",@@X.object_id

  end

end

#=> nil

Foo.show

nil

"hi"

4

#=> [nil, "hi", 4]

成功案例:


class Foo

  def self.show

    @@X = 10 if true

    p @@X,"hi",@@X.object_id

  end

end

#=> nil

Foo.show

10

"hi"

4

#=> [10, "hi", 4]


慕尼黑5688855
浏览 511回答 3
3回答

慕无忌1623718

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

12345678_0001

Ruby具有局部变量“提升”。如果在方法中的任何地方都对局部变量进行了赋值,则该变量在方法中的任何地方都存在,甚至在赋值之前,甚至从未真正执行过赋值。在分配变量之前,其值为nil。编辑:以上不是很正确。Ruby确实有一种变量提升的形式,即当存在局部变量赋值但不执行时,它将定义一个局部变量。但是,在上述方法中发生赋值的点上找不到该变量。
随时随地看视频慕课网APP

相关分类

Ruby
我要回答