我正在玩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 }}
答案 0 :(得分:1)
方法&
在true
,false
,nil
上定义,但不在哈希上定义。
true & obj
为false
或obj
,则{p> nil
会返回false
,否则会返回true
。
false & obj
和nil & obj
返回false
。 obj
总是被评估,因为它是方法调用的参数 - 在这种情况下没有短路评估。
简而言之,请阅读手册。
答案 1 :(得分:1)
a &! b
与a & (!b)
我们可以通过ruby parser看到这一点:
Parser::CurrentRuby.parse("true &! false")
#=>
#s(:send,
# s(:true), :&,
# s(:send,
# s(:false), :!))
&
是按位运算符,但是在布尔值上为nil,它与&&
的作用相同。在红宝石中,所有哈希都是真实的,因此!{foo: 'bar'}
总是false
。
答案 2 :(得分:0)
这是两个不同的运营商。 &
是按位的,当然!
是否定的。因此,true
和false
以及nil
知道按位,但不是哈希。