2015-01-12 5 views
3

Я пытаюсь понять, как работает перегрузка операторов в Джулии. Руководство довольно кратковременно и дает +() в качестве примера, а затем заявляет, что все операторы перегружены с их очевидными именами (также предоставляется список неочевидных имен).Как перегружать + = в Джулии?

Но как насчет +=? Функция +=() даже не существует, и не +=!() (так как это модифицирующая функция). Я часто перегружаю операторы в C++, сначала определяя +=, а затем использую простой + на основе копии и +=.

В моем случае я даже не думаю, что мне нужно +, просто поведение += ... Я понимаю, что могу написать свою собственную функцию модификации, но синтаксис оператора будет приятным. (Из любопытства, как *=, /=, $= и т.д. работать?)

+0

+ = поведение, полученное из функции +, поэтому просто перегрузка + – spencerlyon2

ответ

7

Там нет += функции. Это просто синтаксический сахар для a = a + b.

Это также не мутирует. Таким образом, a += b вычисляет a + b, а затем изменения a для ссылки на результат. Это означает, что имеется выделение памяти для результата a + b.

+1

[имеется выделение памяти] => может потребоваться куча выделения результата из '' '' '' '. – ivarne

+0

@ivarne Да, теперь мне интересно, как сделать какой-то «' + = '», который работает с большими объектами без выделения памяти. Правильно ли, что большие неизменные объекты будут по своей сути иметь эту проблему? А для больших изменяемых объектов следует написать свою собственную мутирующую функцию, а не использовать оператор? Наконец, конечно, для 'Array {T, n}', используя оператор '+ =' (или любой элементный оператор '. * =' И т. Д.), Эффективен с точки зрения памяти ??? Я часто имею дело с большими матрицами, тензорами и т. Д., Которые толкают пределы памяти, и я думал, что Джулия будет хороша для такого типа вещей. – AndyF

+0

Чтобы следить за 'Array', см. [Этот вопрос] (http://stackoverflow.com/questions/26656830/adding-a-scalar-to-a-matrix-efficiently-in-julia). Для меня кажется, что '+ =' * является * памятью неэффективной для 'Array', и вместо этого следует использовать ручные петли или широковещание. Я довольно удивлен! – AndyF

Смежные вопросы