nil和数组的Ruby管道运算符

时间:2016-08-31 04:51:16

标签: ruby

所以我一直在使用|合并两个数组并获得唯一值。

但我发现nil | ["foo", "bar"]返回true而不是["foo", "bar"]

有人可以解释这种行为吗?如果重要的话,Ruby版本是2.2.1。

2 个答案:

答案 0 :(得分:3)

nil是您示例中的接收者,NilClass#|将表达式(参数)的右侧强制转换为布尔值。该表达式相当于nil | !!(["foo", "bar"]),并且因为nil总是假的而且数组永远不是假的,所以它会减少到false | true,它将始终返回true。对于右侧的其他非假值,情况也是如此:

irb(main):001:0> nil|0
=> true
irb(main):002:0> nil|1
=> true
irb(main):003:0> nil|"foo"
=> true
irb(main):004:0> nil|true
=> true
irb(main):005:0> nil|false
=> false
irb(main):006:0> nil|nil
=> false

你可以继续做你正在做的事情,但是如果接收者可能是nil(或者除了数组之外的其他任何东西),你应该将它强制转换为数组以获得{{3}你想要的行为。幸运的是,在Ruby中有一个非常简洁的方法:

[*nil] | ["foo", "bar"]

这"做正确的事情"在各种情况下:

irb(main):001:0> [*nil] | ["foo", "bar"]
=> ["foo", "bar"]
irb(main):002:0> var = "foo"
=> "foo"
irb(main):003:0> [*var] | ["foo", "bar"]
=> ["foo", "bar"]
irb(main):004:0> var = ["bar"]
=> ["bar"]
irb(main):005:0> [*var] | ["foo", "bar"]
=> ["bar", "foo"]
irb(main):006:0> var = []
=> []
irb(main):007:0> [*var] | ["foo", "bar"]
=> ["foo", "bar"]
irb(main):008:0> var = nil
=> nil
irb(main):009:0> [*var] | ["foo", "bar"]
=> ["foo", "bar"]

答案 1 :(得分:1)

|实际上是按位或在ruby中。这意味着整数被视为字节序列而不是整数。它采用相应位的逻辑包含OR运算

1|0  => 1
1|1 => 1
1|2 => 3 

包含布尔运算符,它类似于||

true|false => true
false|false => false
nil|false => false

false | obj =>对或错 nil | obj =>对或错 。事实证明,nilclass被覆盖了

http://ruby-doc.org/core-2.0.0/NilClass.html#method-i-7C

如果是数组,它既不是按位也不是逻辑或者是数组联合。请查找文档。 http://docs.ruby-lang.org/en/2.0.0/Array.html