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 rubydoc下查找。 它接受Array参数并给出一个Array结果,该结果由任一数组中的所有元素组成。
因为Ruby中的几乎所有东西都是一个对象(除了块,这里不相关),除了简单的赋值之外,没有绝对的“运算符”。 事实上,每个运算符都是在某个类上定义的方法,因此也就是上下文。
另外,正如有人正确地指出(现在删除),按位OR处理整数,而不是布尔值: 7 | 12 == 15
7 | 12 == 15
。 逻辑或||
处理布尔值,但它也可以返回非布尔值,因为严格来说除了nil
和false
之外的所有内容都是真的。 因此, 7 || 12
7 || 12
返回7
,不是true
(在大多数情况下仍然等于true)。
更新:我忽略了||
的事实 和&&
,当在布尔对象上使用时,由于它们的短路语义,实际上不能在Ruby中定义。 然而,这并没有改变它们表现得像布尔方法的事实。