Исключение синтаксиса скобок Ruby с i ++ ++ i - PullRequest
2 голосов
/ 28 июня 2011

Почему это вызывает синтаксическую ошибку? Я ожидаю, что это будет наоборот ...

>> foo = 5
>> foo = foo++ + ++foo                                                  
=> 10 // also I would expect 12...                                                                   
>> foo = (foo++) + (++foo)                                              
SyntaxError: <main>:74: syntax error, unexpected ')'                    
      foo = (foo++) + (++foo)                                           
                   ^                                                    
<main>:75: syntax error, unexpected keyword_end, expecting ')'   

Пробовал с tryruby.org, который использует Ruby 1.9.2.


В C # (.NET 3.5) это работает нормально и дает другой результат:

var num = 5;
var foo = num;
foo = (foo++) + (++foo);
System.Diagnostics.Debug.WriteLine(foo); // 12

Я полагаю, это вопрос приоритета оператора? Кто-нибудь может объяснить?

Для полноты ...
C возвращает 10
Java возвращает 12

Ответы [ 3 ]

12 голосов
/ 28 июня 2011

В Ruby нет оператора ++.Ruby принимает ваши foo++ + ++foo и первые из этих плюсов в качестве бинарного оператора сложения, а остальные в качестве унарных положительных операторов на втором foo.

Итак, выс просьбой к Ruby добавить 5 и (плюс плюс плюс плюс) 5, что равно 5, следовательно, результат 10.

Когда вы добавляете скобки, Ruby ищет второй операнд (для двоичного сложения) передпервая закрывающая скобка и жалоба, потому что она не находит.

Откуда вы взяли, что Ruby изначально поддерживал оператор ++ в стиле C?Выбросьте эту книгу.

10 голосов
/ 28 июня 2011

Ruby не поддерживает этот синтаксис.Вместо этого используйте i+=1.

Как упомянул @Dylan, Ruby читает ваш код как foo + (+(+(+(+foo)))).По сути, он читает все знаки + (после первого) как помечает целое число как положительное.

6 голосов
/ 28 июня 2011

Ruby не имеет оператора ++. В вашем примере он просто добавляет второй foo, «потребляя» один плюс, и рассматривает остальные как унарные операторы +.

...