红宝石按位或

时间:2010-08-02 02:00:49

标签: 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包含非布尔值?

1 个答案:

答案 0 :(得分:4)

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

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

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

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