Имеет ли 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