Приоритет оператора для And/&& в Ruby [дубликат]

Чистота кода важна.

Каждый начинает получать чувство, что код может не сохраняться и на пути browfield, когда каждый видит лишние использования. В сущности, когда я вижу некоторые неиспользованные операторы использования, немного желтого флага повышается позади моего мозга, говоря мне "соблюсти осторожность". И чтение производственного кода никогда не должно давать Вам то чувство.

Так очищают Ваши использования. Не будьте неаккуратны. Внушите доверие. Сделайте свой код симпатичным. Дайте другой dev что тепло-нечеткое чувство.

14
задан Andrew Grimm 26 March 2012 в 22:41
поделиться

5 ответов

Я не совсем понимаю вопрос, который вы задаете. Я имею в виду, вы уже сами дали ответ, прежде, чем даже задали вопрос: && связывает сильнее, чем = , а и связывается менее прочно, чем = .

Итак, в первом случае выражение оценивается следующим образом:

( 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
23
ответ дан 1 December 2019 в 06:59
поделиться

Причина проста: приоритет. Как вы говорите, порядок следующий:

  1. &&
  2. =
  3. и

Поскольку && имеет приоритет над = , выражение оценивается следующим образом:

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 
21
ответ дан 1 December 2019 в 06:59
поделиться

Из Программирование Ruby 1.9 :

Единственное различие в двух формах - это приоритет ( и связывает ниже, чем && ).

2
ответ дан 1 December 2019 в 06:59
поделиться

, если вы измените свой код таким образом, вы получите то, что ожидаете

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

-6
ответ дан 1 December 2019 в 06:59
поделиться

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

1 f(2) &&  b => expr1
2 expr1 = f(4) => expr2
3 a = expr2

. Очевидно, что на шаге 2 мы получаем некорректную ситуацию - слева от = находится rvalue - временный объект, которому нельзя присвоить любое значение. Я предполагаю, что синтаксический анализатор нарушает правила приоритетной оценки выражений при возникновении таких ситуаций. Более подробную информацию о вычислениях выражений можно найти здесь

0
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: