2016-03-16 3 views
2

Я играл с Ruby, и я наткнулся на &!, так что я играл с ним немного: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), :!)) 

& является побитовым и оператором, однако на логических значения и ноль он действует так же, как &&. В рубине все хеши правдивы, поэтому !{foo: 'bar'} всегда false.

+0

@ penne12 Это все, что вы хотели знать? – sawa

+0

@sawa Я просто очень оценил тот факт, что ответ включал sexp - помог мне понять это лучше - ваш ответ тоже был очень полезен, –

1

Метод & определяется на true, false, nil, но не на хэш.

true & obj возвращает false если obj является nil или false, true иначе. false & obj и nil & obj возвращение false. obj всегда оценивается как аргумент вызова метода - в этом случае оценка короткого замыкания отсутствует.

Вкратце, прочтите руководство.

0

Это два разных оператора. & побитово, и ! - это отрицание, конечно. Итак, true и false и nil знают о побитом и, но не о хешах.

Смежные вопросы