Ruby&! (和爆炸)操作员

时间:2016-03-16 22:48:43

标签: ruby syntax

我正在玩Ruby,我遇到&!,所以我玩了一下:

true &! true #=> false
true &! false #=> true
true &! nil #=> true
true &! {:test=>:foo} #=> false
false &! true #=> false
false &! false #=> false
false &! nil #=> false
false &! {:test=>:foo} #=> false
nil &! true #=> false
nil &! false #=> false
nil &! nil #=> false
nil &! {:test=>:foo} #=> false

到目前为止看起来像value && !value,但是......

{:test=>:foo} &! true

发出错误

NoMethodError: undefined method `&' for {:test=>:foo}:Hash
        from (irb):23:in `block (2 levels) in irb_binding'
        from (irb):23:in `each'
        from (irb):23:in `block in irb_binding'
        from (irb):23:in `each'
        from (irb):23
        from /usr/local/bin/irb:11:in `<main>'

那么,我认为这是两个不同的运营商?如果是这样,他们做了什么?我不认为我见过他们。用于比较值是否安全?

PS:这是我用来测试它的脚本:

test.each {|v| test.each{ |v2| print "#{v.inspect} &! #{v2.inspect} #=> " ; p v &! v2 }}

3 个答案:

答案 0 :(得分:1)

方法&truefalsenil上定义,但不在哈希上定义。

如果true & objfalseobj,则{p> nil会返回false,否则会返回truefalse & objnil & obj返回falseobj总是被评估,因为它是方法调用的参数 - 在这种情况下没有短路评估。

简而言之,请阅读手册。

答案 1 :(得分:1)

a &! ba & (!b)

相同

我们可以通过ruby parser看到这一点:

Parser::CurrentRuby.parse("true &! false") 
#=> 
#s(:send,
# s(:true), :&,
# s(:send,
#   s(:false), :!))

&是按位运算符,但是在布尔值上为nil,它与&&的作用相同。在红宝石中,所有哈希都是真实的,因此!{foo: 'bar'}总是false

答案 2 :(得分:0)

这是两个不同的运营商。 &是按位的,当然!是否定的。因此,truefalse以及nil知道按位,但不是哈希。