В Julia функции всегда имеют режим передачи аргументов при передаче:
https://docs.julialang.org/en/v1/manual/functions/
Это соглашение о передаче аргументов также используется в большинстве языков динамического программирования общего назначения,включая различные Lisps, Python, Perl и Ruby.Хорошее и полезное описание можно найти здесь:
https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing
Короче говоря, передача по принципу совместного использования работает подобно передаче по ссылке, но вы не можете изменить значение привязки вобласть вызова относится к переназначению аргумента в вызываемой функции - если вы переназначаете аргумент, привязка в вызывающей стороне остается неизменной.Это означает, что в общем случае вы не можете использовать функции для изменения привязок, например, для замены переменных.(Однако макросы могут изменять привязки в вызывающей стороне.) В частности, если переменная в вызывающей стороне ссылается на неизменяемое значение, такое как целое число или число с плавающей запятой, ее значение не может быть изменено посредством вызова функции, поскольку какой объектссылка на переменную не может быть изменена вызовом функции, а само значение не может быть изменено, поскольку оно является неизменным.
Если вы хотите, чтобы что-то вроде R или Matlab передавало поведение по значению, вам нужно явно создать копиюаргумента до его изменения.Это именно то, что делают R и Matlab, когда аргумент передается в модифицированном и сохраняется внешняя ссылка на аргумент.В Юлии это должно быть сделано явно программистом, а не автоматически системой.Недостатком является то, что система может иногда знать, что копия не требуется (внешние ссылки не сохраняются), когда программист вообще не может этого знать.Однако эта способность тесно связана с техникой сбора мусора, которая не используется Юлией из-за соображений производительности.
По соглашению функции, изменяющие содержимое аргумента, имеют постфикс !
.(например, sort
v / s sort!
).