2016-02-06 4 views
7

документы говорятЮлия аргумент функции по ссылке

В Юли, все аргументы функции передаются по ссылке.

, так что я был очень удивлен увидеть разницу в поведении этих двух функций:

function foo!(r::Array{Int64})                                              
     r=r+1                                                  
end 


function foobar!(r::Array{Int64})                                             
     for i=1:length(r)                                               
       r[i]=r[i]+1                                               
     end                                                   
end 

здесь является неожиданно другая выход:

julia> myarray 
2-element Array{Int64,1}: 
0 
0 

julia> foo!(myarray); 

julia> myarray 
2-element Array{Int64,1}: 
0 
0 

julia> foobar!(myarray); 

julia> myarray 
2-element Array{Int64,1}: 
1 
1 

если массив передается по ссылка, я бы ожидал foo! изменить нули на единицы.

ответ

13

r=r+1 является Назначением утверждения, это не означает, что она перераспределяет r, так что она больше не относится к своим парам в родительской области. но r[i]=r[i]+1Мутаты Значение r, мутация отличается от назначения (a good description here), и после этого r по-прежнему относится к своей переменной пары в родительской области.

8

Я думаю, что документ здесь немного расплывчатый.

Строго говоря, Julia является «call-by-value, где значение является ссылкой» или «совместное использование вызовов», которое используется большинством языков, таких как python, java, ruby, js ... See wiki

Вызов по эталонному поведению действительно сделает foo!, чтобы изменить нули на единицы. Однако Джулия этого не поддерживает. (Если вы знаете C#, то есть то, что ref или out делает)

+1

Я также видел термин «вызов по указателю» (или «проход по указателю»), используемый для ссылки на это, что я считаю короткое и точное. В любом случае, всегда стоит напоминать, что термины используются иногда для целей теории языка, иногда для целей практики. И эти значения не всегда совпадают или даже отличаются в пределах дисциплины в зависимости от автора! –

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