Есть ли хорошее применение для логических (логических) операторов без короткого замыкания в Java / Scala? - PullRequest
11 голосов
/ 03 марта 2012

Недавно я обнаружил, что Java (и Scala) включают в себя логические операторы без короткого замыкания &, | и ^. Раньше я думал, что они работают только как побитовые операторы. Хотя, возможно, есть аргумент для ^, я не могу придумать очень веских причин для использования не короткозамкнутых логических операторов - хотя, конечно, я могу придумать пример.

Эти операторы полезны? Похоже, что они чаще вызывают труднопроходимые ошибки.

scala> def foo = {
     |   println("foo")
     |   true
     | }
foo: Boolean

scala> def bar = {
     |   println("bar")
     |   true
     | }
bar: Boolean

scala> foo || bar
foo
res5: Boolean = true

scala> foo | bar
foo
bar
res6: Boolean = true

Ответы [ 4 ]

15 голосов
/ 03 марта 2012

Они полезны, если правая часть - это функция с побочными эффектами, которые вы хотите выполнить независимо (например, ведение журнала). Тем не менее, я бы предположил, что это немного пахнет кодом и, безусловно, не будет интуитивно понятным для следующего парня.

8 голосов
/ 03 марта 2012

Хм. Я знаю, что они могут быть невероятно полезными для оптимизации кода C / C ++, если их использовать осторожно. Это может относиться и к Java.

Основное использование в C - кроме реальных битовых операций - это удаление конвейерной задержки. Операторы короткого замыкания требуют операции ответвления. Побитовый оператор вычислит обе стороны и удалит шанс для непредсказуемой ветви и получающейся остановки.

2 голосов
/ 03 марта 2012

Использование логических операторов без короткого замыкания подразумевает, что операнды имеют побочные эффекты. Если бы они не имели побочных эффектов, то программист мог бы использовать версии с коротким замыканием без изменений в функциональности.

В коде, написанном в функциональном стиле (который Scala, безусловно, поощряет, но не требует), побочные эффекты указывают на то, что происходит что-то необычное. Необычные вещи должны быть четко обозначены в коде, а не чем-то таким тонким, как логический оператор без короткого замыкания.

0 голосов
/ 03 марта 2012

Если вы пытаетесь отслеживать ответы или вводить что-то, и это зависит от обеих сторон вашего логического режима без короткого замыкания.

Например, скажем, у вас есть:

if(methodA() & methodB()){
    //some code
}

И внутри метода methodB () выполняется некоторый необходимый код.Если бы это был код короткого замыкания (&&), а methodA () - false, methodB () никогда бы не запустился.

Это одно из применений, которое я могу себе представить, по крайней мере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...