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