Чистота кода важна.
Каждый начинает получать чувство, что код может не сохраняться и на пути browfield, когда каждый видит лишние использования. В сущности, когда я вижу некоторые неиспользованные операторы использования, немного желтого флага повышается позади моего мозга, говоря мне "соблюсти осторожность". И чтение производственного кода никогда не должно давать Вам то чувство.
Так очищают Ваши использования. Не будьте неаккуратны. Внушите доверие. Сделайте свой код симпатичным. Дайте другой dev что тепло-нечеткое чувство.
Я не совсем понимаю вопрос, который вы задаете. Я имею в виду, вы уже сами дали ответ, прежде, чем даже задали вопрос: &&
связывает сильнее, чем =
, а и
связывается менее прочно, чем =
.
Итак, в первом случае выражение оценивается следующим образом:
( a=f(2) ) and ( b=f(4) )
( a= 2 ) and ( b=f(4) )
2 and ( b=f(4) ) # a=2
2 and ( b= 4 ) # a=2
2 and 4 # a=2; b=4
4 # a=2; b=4
Во втором случае оценка выглядит следующим образом:
a = ( f(2) && ( b=f(4) ) )
a = ( 2 && ( b=f(4) ) )
a = ( 2 && ( b= 4 ) )
a = ( 2 && 4 ) # b=4
a = 4 # b=4
4 # b=4; a=4
Причина проста: приоритет. Как вы говорите, порядок следующий:
Поскольку &&
имеет приоритет над =
, выражение оценивается следующим образом:
if a = (f(2) && (b = f(4))) then
Результат:
if a = (2 && 4) then
Когда x
и y
являются целыми числами, x && y
возвращает y
. Таким образом, 2 && 4
приводит к a = 4
.
Для сравнения, первый вычисляется следующим образом:
if (a = f(2)) and (b = f(4)) then
Из Программирование Ruby 1.9 :
Единственное различие в двух формах - это приоритет (
и
связывает ниже, чем&&
).
, если вы измените свой код таким образом, вы получите то, что ожидаете
def f(n)
n
end
if (a = f(2) and b = f(4)) then
puts "1) #{a} #{b}"
end
if (a = f(2) and b = f(4)) then
puts "2) #{a} #{b}"
end
1) 2 4
2) 2 4
Я не знаю конкретных правил, которые могут помочь в этой ситуации, но давайте воспользуемся приоритетами операций. Используя правила приоритетов, мы можем разделить вычисление второго выражения на несколько шагов
1 f(2) && b => expr1
2 expr1 = f(4) => expr2
3 a = expr2
. Очевидно, что на шаге 2 мы получаем некорректную ситуацию - слева от = находится rvalue - временный объект, которому нельзя присвоить любое значение. Я предполагаю, что синтаксический анализатор нарушает правила приоритетной оценки выражений при возникновении таких ситуаций. Более подробную информацию о вычислениях выражений можно найти здесь