Как передать объект по ссылке и значению в юлию? - PullRequest
2 голосов
/ 29 сентября 2019

Я знаю, что с здесь :

Аргументы функции Julia следуют соглашению, иногда называемому "передача по совместному использованию", что означает, что значения не копируются, когда ониперешел к функциям.Сами аргументы функции действуют как новые привязки переменных (новые местоположения, которые могут ссылаться на значения), но значения, на которые они ссылаются, идентичны переданным значениям.Изменения изменяемых значений (таких как массивы), сделанные внутри функции, будут видны вызывающей стороне.Это то же поведение, что и в Scheme, в большинстве Lisps, Python, Ruby и Perl, среди других динамических языков.

Учитывая это, мне ясно, что для передачи по ссылке все, что вам нужно сделатьимеет изменчивый тип, который вы передаете в функцию и редактируете.

Тогда возникает мой вопрос: как я могу четко различать передачу по значению и передачу по ссылке?У кого-нибудь есть пример, который показывает функцию, вызываемую дважды;один раз с передачей по ссылке, и один раз с передачей по значению?

Я видел этот пост , в котором упоминаются некоторые похожие идеи, но он не полностью ответил на мой вопрос.

1 Ответ

4 голосов
/ 29 сентября 2019

В 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!).

...