2016-03-16 52 views
2

我和红宝石打过来,我穿过&!来了,所以我用它打了一下周围: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>' 

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

PS:这是我用来测试这个脚本:

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

回答

1

a &! b相同a & (!b)

我们可以用红宝石parser看到这一点:

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

&是按位与操作,但是在布尔值和nil它的作用一样&&。在红宝石中所有的哈希都是真的,所以!{foo: 'bar'}总是false

+0

@ penne12这是你想知道的吗? – sawa

+0

@sawa我真的很感激这个事实,答案包括sexp - 帮助我更好地理解它 - 你的回答也很有帮助, –

1

方法&truefalsenil,而不是一个散列定义。

true & obj返回false如果objnilfalsetrue否则。 false & objnil & obj返回falseobj总是被评估为它是方法调用的参数 - 在这种情况下没有短路评估。

总之,阅读手册。

0

这是两个不同的运营商。 &是按位和,并且!当然是否定的。所以truefalsenil知道按位,而不是散列。