Ключевое слово для эксклюзивного или рубинового?

Имеет ли Ruby одноименное ключевое слово для эксклюзивного или, как у них есть "и" и "или"? Если нет, то это потому, что исключает или не позволяет оценивать короткую резку?

Ответ 1

Во-первых, я не думаю, что shortcircuiting может разумно относиться к XOR: независимо от значения первого операнда, второй должен быть рассмотрен.

Во-вторых, и, & &, или и || используйте короткое замыкание во всех случаях; единственная разница между версиями "слово" и "символ" - это приоритет. Я считаю, что and и or присутствуют, чтобы обеспечить ту же функцию, что и perl в строках типа

process_without_error or die

Я думаю, что причина отсутствия функции с именем xor, вероятно, заключается в том, что в этом случае нет смысла в операторе с низким приоритетом и что это уже довольно запутанная ситуация!

Ответ 2

Нет, нет, вы можете использовать ^.

Не знаю, почему нет особого, может быть только потому, что это не так часто используется.

Ответ 3

Я столкнулся с проблемой, потому что оператор "^" действует побитовым по номерам,

true ^ 1
=> false

1 ^ true
TypeError: can't convert true into Integer
true ^ 1

поэтому мой способ был:

( !!a ^ !!b ), где double-bang принуждает их к boolean.

!!1 ^ !!true
=> false

!!1 ^ !!false
=> true

Ответ 4

Попробуйте ^

true  ^ false #=> true
true  ^ true  #=> false
false ^ false #=> false

Нет простого английского эквивалентного оператора.

Ответ 5

В качестве альтернативы трюку двойного отрицания Мэтта Ван Хорна для использования XOR на произвольных типах вы можете связать другой тест XOR, начиная с nil. то есть:.

!!foo ^ !!bar

эквивалентно

nil ^ foo ^ bar

Это выглядит более аккуратно, и я полагаю, что требуется менее логичная операция

Ответ 6

Ответ Джона выглядит некорректным. В irb с 1.9.3 xor ( "cupcake", false) возвращает true, как и следовало ожидать.

1.9.3-p429 :104 > def xor(a,b)
1.9.3-p429 :105?>     (a and (not b)) or ((not a) and b)
1.9.3-p429 :106?>   end
 => nil 
1.9.3-p429 :107 > xor(false, true)
 => true 
1.9.3-p429 :108 > xor("cupcake", false)
 => true 

Ответ 7

Любая реализация xor не позволит короткого замыкания. Оба выражения должны быть оценены независимо от того, что.

Ruby предоставляет оператор ^, но это будет забивать правдивые значения. Я реализовал функцию для обработки случаев, когда мне нужен xor, который больше похож на and и or:

def xor(a,b)
  (a and (not b)) or ((not a) and b)
end

В отличие от ^, эта функция может использоваться в ситуациях, аналогичных следующим:

xor("hello".match(/llo/), false) # => true
xor(nil, 1239)                   # => true
xor("cupcake", false)            # => false