2016-02-06 17 views
7

La documentazione direfunzione Julia argomento per riferimento

In Julia, tutti gli argomenti alle funzioni vengono passati per riferimento.

quindi ero abbastanza sorpresa di vedere una differenza nel comportamento di queste due funzioni:

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 

ecco inaspettatamente diversa uscita:

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 

se la matrice viene passata da riferimento, mi sarei aspettato che pippo! per cambiare gli zeri con quelli.

risposta

13

r=r+1 è un'assegnazione dichiarazione , questo significa che rialloca r, quindi non si riferisce più alla sua coppia nell'ambito genitore. ma r[i]=r[i]+1Mutazioni valore r, la mutazione è diversa dall'assegnazione (a good description here) e dopo che r si riferisce ancora alla sua variabile coppia nell'ambito genitore.

8

Penso che il documento sia un po 'vago qui.

In senso stretto, Julia è "call-by-value dove il valore è un riferimento" o "call-by-sharing", utilizzato dalla maggior parte dei linguaggi come python, java, ruby, js ... Vedi wiki

Una chiamata per comportamento di riferimento farebbe sì che foo! modifichi gli zeri con uno. Tuttavia, Julia non lo supporta. (Se conosci C#, questo è ciò che fa ref o)

+1

Ho anche visto il termine "call-pointer" (o "pass-by-pointer") usato per riferirsi a questo, che considero Breve e dritto al punto. In ogni caso, vale sempre la pena ricordare che i termini sono usati a volte per la teoria del linguaggio, a volte per scopi pratici. E questi significati non sempre coincidono, o addirittura differiscono all'interno di una disciplina che dipende dall'autore! –

Problemi correlati