Операторы присваивания Ruby - PullRequest
3 голосов
/ 01 января 2011

Почему сложение «оператор» является методом, а оператор присваивания + = нет?

Почему операторы работают следующим образом:

ruby-head> 2. + (4)
=> 6

Пока операторы назначения работают следующим образом:

ruby-head> i = 1
=> 1
ruby-head> i + = 1
=> 2
ruby-head> i. + = (1) SyntaxError: (irb): 26: синтаксическая ошибка, неожиданная '=' i. + = (1) ^из /Users/fogonthedowns/.rvm/rubies/ruby-head/bin/irb:17:in `'

Ответы [ 3 ]

11 голосов
/ 01 января 2011

Поскольку присваивание работает с переменными, а не с объектами, и поэтому не может быть реализовано как метод

1 голос
/ 01 января 2011

+ = (как я и предполагал) синтаксический сахар, использующий метод +. Если вы создаете подкласс или monkey-patch для изменения класса поведения +:

class CustomPlus
  attr_accessor :value
  def initialize(value)
    @value = value
  end
  def +(other)
    value + other * 2
  end
end

Тогда результат таков:

ruby-1.9.1-p378 > a = CustomPlus.new(2)
 => #<CustomPlus:0x000001009eaab0 @value=2> 
ruby-1.9.1-p378 > a.value
 => 2 
ruby-1.9.1-p378 > a+=2
 => 6 
0 голосов
/ 01 января 2011

Потому что += это просто сокращение для полного выражения.

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

Трудно представить, что можно получить за всю эту дополнительную работу, поэтому Ruby рассматривает объединенные операторы присваивания просто как сокращение для полного выражения.

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