为什么在if的块中不能使用在`if`条件中初始化的变量?

lul*_*ala 1 ruby

因此,通常在if条件中初始化变量,然后在if的块内使用该变量.

if a = foo()
   puts a
end
Run Code Online (Sandbox Code Playgroud)

但是,当我初始化一个变量并在同一个if块中使用它时,那个var将不会被认为是初始化的.例如:

def good?(item)
  puts "item is #{item.inspect}"
  true
end

if b = 52 && good?(b)
  puts "b is #{b.inspect}"
end
Run Code Online (Sandbox Code Playgroud)

运行上面的结果将是

item is nil
b is true
Run Code Online (Sandbox Code Playgroud)

为什么会这样?什么样的关键字与我搜索和研究的这种Ruby行为有关?

Yu *_*Hao 9

优先级&&高于=,所以

if b = 52 && good?(b)
Run Code Online (Sandbox Code Playgroud)

相当于:

if b = (52 && good?(b))
Run Code Online (Sandbox Code Playgroud)

参考:运算符优先级.


Oka*_*Oka 8

你要分配给你b的结果52 && good?(b).b它仍然nil是传递给good?.

括号是关键.

def good?(item)
  puts "item is #{item.inspect}"
  true
end

if (b = 52) && good?(b)
  puts "b is #{b.inspect}"
end
Run Code Online (Sandbox Code Playgroud)

结果:

item is 52
b is 52
Run Code Online (Sandbox Code Playgroud)