有人可以在下面的代码中解释为什么名为foo
的变量仍然是true
,即使在调用该方法时它被设置为false
吗?为什么符号版本的行为符合预期?
def test(options = {})
foo = options[:foo] || true
bar = options[:bar] || :true
puts "foo is #{foo}, bar is #{bar}"
end
>> test(:foo => false, :bar => :false)
foo is true, bar is false
我只使用Ruby 1.8.7尝试过这个。
答案 0 :(得分:4)
该行
foo = options[:foo] || true
options[:foo]
为false
的可以改写为
foo = false || true
这显然是true
。
当第一个运算符在未定义时采用错误值(例如||
)时,运算符nil
只能用作“除非定义”运算符。在您的情况下,false
是一个已定义的值,因此您无法像您一样使用||
。尝试用这种方式重写:
foo = options.fetch(:foo, true)
这将返回:foo
键的值,如果未设置,则返回true
。
答案 1 :(得分:2)
||是OR。 你基本上做的是将foo赋给false ||真正。当至少有一个选项为真时,OR返回true,如果两个选项都为假,则返回false。
OR门的真值表如下:
INPUT1 | INPUT2 | OUTPUT
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1