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

时间:2015-09-15 05:06:33

标签: ruby

因此,在if条件下初始化变量,然后在if块中使用该变量是很常见的。

if a = foo()
   puts a
end

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

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

if b = 52 && good?(b)
  puts "b is #{b.inspect}"
end

运行以上操作,结果将是

item is nil
b is true

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

2 个答案:

答案 0 :(得分:9)

&&的优先级高于=,所以

if b = 52 && good?(b)

相当于:

if b = (52 && good?(b))

参考:Operator Precedence

答案 1 :(得分: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

括号是关键。

item is 52
b is 52

结果:

//= require ember-template-compiler