Ruby哈希值真实性和符号

时间:2010-05-09 10:56:46

标签: ruby

有人可以在下面的代码中解释为什么名为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尝试过这个。

2 个答案:

答案 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