Как ruby ​​делает оператор +?

Ruby не поддерживает увеличение переменных, таких как variable++. Я видел это поведение, которое:

2 ++ 4

дает 6. Фактически любое количество знаков + между двумя переменными рассматривается как один единственный +. Как Руби справляется с этим? И так как это делает ruby, можно ли считать это причиной недоступности оператора ++?


person AshwinKumarS    schedule 02.07.2014    source источник
comment
2 +- 4 тоже работает...почему-то   -  person MxLDevs    schedule 02.07.2014
comment
@MxyL: Это потому, что это 2 + (-4), поэтому вы получаете унарный оператор - (метод AKA -@).   -  person mu is too short    schedule 02.07.2014
comment
2+- 4!! понял бы работу, если бы я сделал это! :)   -  person AshwinKumarS    schedule 02.07.2014


Ответы (2)


Этот:

2 ++ 4

анализируется как:

2 + (+4)

так что второй + - это унарный плюс. Добавление большего количества плюсов просто добавляет больше унарных операторов +, поэтому:

2 ++++++ 4

рассматривается как:

2 + (+(+(+(+(+(+4))))))

Если вы предоставите свой метод +@ в Fixnum:

class Fixnum
  def +@
    puts 'unary +'
    self
  end
end

тогда вы даже можете увидеть, как это происходит:

> 2 ++ 4
unary +
 => 6 
person mu is too short    schedule 02.07.2014
comment
Что-то не так с переопределяющим фрагментом кода? не работает для меня. - person AshwinKumarS; 02.07.2014
comment
Вы говорите 2 ++ 4 или 2 ++4? Ruby чувствителен к пробелам. Вы также заметите, что +4 не будет вызывать +@, сам синтаксический анализатор преобразует его только в 4 до того, как метод будет вызван. - person mu is too short; 02.07.2014
comment
Какая версия Ruby и как вы проверяете? - person mu is too short; 02.07.2014
comment
1.8.7. Заходим в irb и используем там свой код. - person AshwinKumarS; 02.07.2014
comment
У меня больше нет версии 1.8.7, возможно, вам следует использовать более новый Ruby. - person mu is too short; 02.07.2014
comment
Я предполагаю, что 1.8.7 интерпретирует + 4 как просто 4, прежде чем что-либо получит возможность вызвать метод +@. - person mu is too short; 03.07.2014

Вместо ++ используйте += Пример: a=2 a+=3 ставит a

5

person max    schedule 02.07.2014
comment
Да, но почему ++ работает? Или ++++++++++ в этом отношении. Обратите внимание, что вы даже можете сказать 8 +---------- 3, и это все равно допустимая операция. - person MxLDevs; 02.07.2014
comment
+= работает известно. Я просто хотел узнать тайну множественных плюсов. :) - person AshwinKumarS; 02.07.2014