Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Ruby > ruby переопределение операторов


Автор: applegame 26.12.12, 12:40
Есть ли возможность в руби как-то нормально реализовать оператор += ?
Я конечно знаю, что можно просто переопределить оператор + а руби сам a += b преваратит в a = a + b
Задница в том что во время простой операции сложения возвращается новый объект, а в случае += в новом объекте нет необходимсоти, достаточно модифицировать уже существующий. Как сделать += в руби не создавая новых объектов?

Автор: deil 28.12.12, 08:26
С каких пор += не возвращает новый объект? Что мешает в + не возвращать новый объект, а модифицировать первый операнд?

Автор: amk 28.12.12, 16:51
Вообще-то думаю будет совсем нехорошо, если при выполнении строки
a = b + c
кроме a будет изменяться и b.

Так что не думаю, что изменение семантики операции + (или любой другой подобной) может кончиться чем то хорошим.

Автор: applegame 29.12.12, 22:15
Цитата deil @
С каких пор += не возвращает новый объект?
В руби не существует += самого по себе. Оно заменяется на + и =
Цитата deil @
Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.

Насколько я понял придется просто написать метод делающий то что нужно. Но так хотелось, чтобы еще и выглядело красиво. И почему они не сделали отдельный метод +=?

Автор: amk 29.12.12, 23:04
В Алголе 68, Алголе W и Аде (хотя могу и ошибаться) в этом смысле хорошо. Там можно новые операторы определять.

Автор: deil 07.01.13, 23:09
Цитата applegame @
Цитата deil @
С каких пор += не возвращает новый объект?
В руби не существует += самого по себе. Оно заменяется на + и =
Цитата deil @
Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.

Насколько я понял придется просто написать метод делающий то что нужно. Но так хотелось, чтобы еще и выглядело красиво. И почему они не сделали отдельный метод +=?

Ну каков вопрос, таков и ответ собственно..

Автор: korvin 13.01.13, 09:44
Цитата amk @
В Алголе 68, Алголе W и Аде (хотя могу и ошибаться) в этом смысле хорошо. Там можно новые операторы определять.

В Хаскелле, например, тоже, только читать код наводненный разнообразными операторами с разными приоритетами как-то не очень легко.

Автор: Мохнатый 16.01.13, 06:23
Цитата applegame @
Есть ли возможность в руби как-то нормально реализовать оператор += ?

Нормально он реализован.

Автор: applegame 23.01.13, 12:40
Цитата Мохнатый @
Нормально он реализован.
В целом, да, работает. Возможно сказываются мои плюсовые замашки оптимизировать все что оптимизируется.

Автор: deil 25.01.13, 12:16
Я бы переформулировал вопрос так: код на С++ нужно постоянно оптимизировать? ;)

Автор: applegame 25.01.13, 19:20
Цитата deil @
Я бы переформулировал вопрос так: код на С++ нужно постоянно оптимизировать? ;)
В C++ не нужно постоянно пессимизировать.

Автор: deil 29.01.13, 11:45
Это что значит?

Автор: applegame 01.02.13, 07:24
Цитата deil @
Это что значит?
Есть такая штука - преждевременная пессимизация. В С++ это применение постфиксного ++ там где можно применить префиксный. Передача объемных данных по значению, а не по ссылке, применение неподходящих контейнеров и т.п. Поэтому когда я вижу что в операторе += происходят бессмысленные копирования я чувствую себя неуютно.

a += b (модифицируется кусок памяти переменной a)
a = a + b (резервируется новый кусок памяти, в него помещается результат a + b, старый кусок - собирается сборщиком мусора)

Как минимум две лишних операции: аллокация памяти и освобождение. В C++, в подобных случаях, я на автомате ненужные операции с памятью исключаю.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)