2010-08-02 60 views
-1

这里是代码红宝石按位或

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 

我想|是按位或运算符。那么如何来b包含非布尔值?

回答

4

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

由于Ruby中的几乎所有东西都是一个对象(除了块,这里不相关),除了简单的赋值外,没有绝对的“运算符”。每个操作符实际上都是在某个类上定义的方法,因此是上下文相关的。有人正确指出(现在删除),按位OR处理整数,而不是布尔:7 | 12 == 15。逻辑或||处理布尔值,但它也可以返回非布尔值,因为严格来说,除nilfalse之外的所有内容都为真。因此,7 || 12返回7,而不是true(在大多数情况下,它仍然等于true)。

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

+0

该代码是Rails代码片段。对不起,我应该提到这一点。 – 2010-08-02 16:27:22