ruby按位或

这是代码

def tmp a = ancestors.first(ancestors.index(ActiveRecord::Base)) b = a.sum([]) { |m| m.public_instance_methods(false) | m.private_instance_methods(false) | m.protected_instance_methods(false) } b.map {|m| m.to_s }.to_set end 

我以为| 是按位OR运算符。 那么为什么b包含非布尔值?

如果你说你的代码应该做什么会有所帮助,但我想我终于明白了。 | 你所拥有的不是一个OR,既不是按位也不是逻辑。 这是一个数组联合操作。 在Array ruby​​doc下查找。 它接受Array参数并给出一个Array结果,该结果由任一数组中的所有元素组成。

因为Ruby中的几乎所有东西都是一个对象(除了块,这里不相关),除了简单的赋值之外,没有绝对的“运算符”。 事实上,每个运算符都是在某个类上定义的方法,因此也就是上下文。

另外,正如有人正确地指出(现在删除),按位OR处理整数,而不是布尔值: 7 | 12 == 15 7 | 12 == 15 。 逻辑或|| 处理布尔值,但它也可以返回非布尔值,因为严格来说除了nilfalse之外的所有内容都是真的。 因此, 7 || 12 7 || 12返回7 ,不是true (在大多数情况下仍然等于true)。

更新:我忽略了||的事实 和&& ,当在布尔对象上使用时,由于它们的短路语义,实际上不能在Ruby中定义。 然而,这并没有改变它们表现得像布尔方法的事实。