![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.34.122] |
![]() |
|
Сообщ.
#1
,
|
|
|
Есть ли возможность в руби как-то нормально реализовать оператор += ?
Я конечно знаю, что можно просто переопределить оператор + а руби сам a += b преваратит в a = a + b Задница в том что во время простой операции сложения возвращается новый объект, а в случае += в новом объекте нет необходимсоти, достаточно модифицировать уже существующий. Как сделать += в руби не создавая новых объектов? |
Сообщ.
#2
,
|
|
|
С каких пор += не возвращает новый объект? Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
|
Сообщ.
#3
,
|
|
|
Вообще-то думаю будет совсем нехорошо, если при выполнении строки
a = b + c кроме a будет изменяться и b. Так что не думаю, что изменение семантики операции + (или любой другой подобной) может кончиться чем то хорошим. |
Сообщ.
#4
,
|
|
|
Цитата deil @ В руби не существует += самого по себе. Оно заменяется на + и =С каких пор += не возвращает новый объект? Цитата deil @ Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.Что мешает в + не возвращать новый объект, а модифицировать первый операнд? Насколько я понял придется просто написать метод делающий то что нужно. Но так хотелось, чтобы еще и выглядело красиво. И почему они не сделали отдельный метод +=? |
Сообщ.
#5
,
|
|
|
В Алголе 68, Алголе W и Аде (хотя могу и ошибаться) в этом смысле хорошо. Там можно новые операторы определять.
|
Сообщ.
#6
,
|
|
|
Цитата applegame @ Цитата deil @ В руби не существует += самого по себе. Оно заменяется на + и =С каких пор += не возвращает новый объект? Цитата deil @ Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.Что мешает в + не возвращать новый объект, а модифицировать первый операнд? Насколько я понял придется просто написать метод делающий то что нужно. Но так хотелось, чтобы еще и выглядело красиво. И почему они не сделали отдельный метод +=? Ну каков вопрос, таков и ответ собственно.. |
![]() |
Сообщ.
#7
,
|
|
Цитата amk @ В Алголе 68, Алголе W и Аде (хотя могу и ошибаться) в этом смысле хорошо. Там можно новые операторы определять. В Хаскелле, например, тоже, только читать код наводненный разнообразными операторами с разными приоритетами как-то не очень легко. |
Сообщ.
#8
,
|
|
|
Цитата applegame @ Есть ли возможность в руби как-то нормально реализовать оператор += ? Нормально он реализован. |
Сообщ.
#9
,
|
|
|
Цитата Мохнатый @ В целом, да, работает. Возможно сказываются мои плюсовые замашки оптимизировать все что оптимизируется. Нормально он реализован. |
Сообщ.
#10
,
|
|
|
Я бы переформулировал вопрос так: код на С++ нужно постоянно оптимизировать?
![]() |
Сообщ.
#11
,
|
|
|
Цитата deil @ В C++ не нужно постоянно пессимизировать. Я бы переформулировал вопрос так: код на С++ нужно постоянно оптимизировать? ![]() |
Сообщ.
#12
,
|
|
|
Это что значит?
|
Сообщ.
#13
,
|
|
|
Цитата deil @ Есть такая штука - преждевременная пессимизация. В С++ это применение постфиксного ++ там где можно применить префиксный. Передача объемных данных по значению, а не по ссылке, применение неподходящих контейнеров и т.п. Поэтому когда я вижу что в операторе += происходят бессмысленные копирования я чувствую себя неуютно.Это что значит? a += b (модифицируется кусок памяти переменной a) a = a + b (резервируется новый кусок памяти, в него помещается результат a + b, старый кусок - собирается сборщиком мусора) Как минимум две лишних операции: аллокация памяти и освобождение. В C++, в подобных случаях, я на автомате ненужные операции с памятью исключаю. |