ruby 在If/else语句中定义的变量是否可以在if/else之外访问?[副本]

yzxexxkh  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(128)

此问题已在此处有答案

Why can I refer to a variable outside of an if/unless/case statement that never ran?(3个答案)
5年前关闭。

def foo
  #bar = nil
  if true
    bar = 1
  else
    bar = 2
  end
  bar #<-- shouldn't this refer to nil since the bar from the if statement is removed from the stack?
end

puts foo # prints "1"

我一直认为你必须做一个临时变量,并将其定义为nil或初始值,这样if/else语句中定义的变量就可以在if/else语句的作用域之外持久化,而不会从堆栈中消失。为什么它打印1而不是nil?

wdebmtf2

wdebmtf21#

变量是函数、类或模块定义、proc、块的局部变量。
在ruby中,if是一个表达式,分支没有自己的作用域。
还要注意,每当解析器看到变量赋值时,它将在作用域even if that code path isn't executed中创建一个变量:

def test
  if false
    a = 1
  end
  puts a
end

test
# ok, it's nil.

它有点类似于JavaScript,尽管它没有将变量提升到作用域的顶部:

def test
  puts a
  a = 1
end

test
# NameError: undefined local variable or method `a' for ...

所以即使你说的是真的,它也不会是nil

相关问题