На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > ruby переопределение операторов
      Есть ли возможность в руби как-то нормально реализовать оператор += ?
      Я конечно знаю, что можно просто переопределить оператор + а руби сам a += b преваратит в a = a + b
      Задница в том что во время простой операции сложения возвращается новый объект, а в случае += в новом объекте нет необходимсоти, достаточно модифицировать уже существующий. Как сделать += в руби не создавая новых объектов?
      Сообщение отредактировано: applegame -
        С каких пор += не возвращает новый объект? Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
          Вообще-то думаю будет совсем нехорошо, если при выполнении строки
          a = b + c
          кроме a будет изменяться и b.

          Так что не думаю, что изменение семантики операции + (или любой другой подобной) может кончиться чем то хорошим.
            Цитата deil @
            С каких пор += не возвращает новый объект?
            В руби не существует += самого по себе. Оно заменяется на + и =
            Цитата deil @
            Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
            Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.

            Насколько я понял придется просто написать метод делающий то что нужно. Но так хотелось, чтобы еще и выглядело красиво. И почему они не сделали отдельный метод +=?
            Сообщение отредактировано: applegame -
              В Алголе 68, Алголе W и Аде (хотя могу и ошибаться) в этом смысле хорошо. Там можно новые операторы определять.
                Цитата applegame @
                Цитата deil @
                С каких пор += не возвращает новый объект?
                В руби не существует += самого по себе. Оно заменяется на + и =
                Цитата deil @
                Что мешает в + не возвращать новый объект, а модифицировать первый операнд?
                Мешает здравый смысл. За подобное поведение следует немедленное отрывание рук.

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

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

                  В Хаскелле, например, тоже, только читать код наводненный разнообразными операторами с разными приоритетами как-то не очень легко.
                    Цитата applegame @
                    Есть ли возможность в руби как-то нормально реализовать оператор += ?

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

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

                              Как минимум две лишних операции: аллокация памяти и освобождение. В C++, в подобных случаях, я на автомате ненужные операции с памятью исключаю.
                              Сообщение отредактировано: applegame -
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0298 ]   [ 15 queries used ]   [ Generated: 29.03.24, 00:08 GMT ]