所以我一直在使用|合并两个数组并获得唯一值。
但我发现nil | ["foo", "bar"]
返回true
而不是["foo", "bar"]
。
有人可以解释这种行为吗?如果重要的话,Ruby版本是2.2.1。
答案 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