Я недавно начал изучать Джулию и столкнулся с соглашением о кодировании использования functionname!
(добавленный восклицательный знак), если функция меняет один из своих аргументов при вызове. Теперь, исходя из python, я обычно принимал как должное, что функции, которые изменяют объект, должны быть реализованы как методы класса, тогда как функции, которые используют объект как константу, также могут быть реализованы как обычные вызовы функций. Позвольте мне продемонстрировать на примере:
Возьмите обычное назначение списка в python и некоторые возможные вызовы функций с ним:
>>> l = [2,1,3]
>>> sorted(l)
[1, 2, 3]
>>> l.sort()
>>> l
[1, 2, 3]
Мне интуитивно понятно - с моей точки зрения и опыта - что первый вызов функции не изменяет сам список, но возвращает копию списка, который был отсортирован. С другой стороны, вызов метода класса действительно меняет сам список, возможно, даже не обязательно используя дополнительную память и т. Д.
Теперь в Julia эти два различных подхода сортировки списка реализованы как sort(l)
, который не изменяет сам список, но возвращает копию отсортированного списка, и sort!(l)
, который изменяет сам список и не создает копию.
Теперь мой вопрос: когда я пишу свой собственный код на Юлии, теперь считается самоочевидным адаптировать мой стиль кодирования к соглашению базовой библиотеки или это просто чистое предпочтение? Вопрос, конечно, не относится исключительно к Юлии, так как я предполагаю, что каждый язык объектно-ориентированного программирования имеет аналогичную «проблему», так как классы могут использовать свои методы для достижения изменения самого класса или «внешней» функции звоните.
Кроме того, каковы преимущества или недостатки использования одного из этих стилей по сравнению с другим, или это зависит от самой функции, полезно ли ее использовать для одного или другого?