2016-02-06 18 views
7

Các tài liệu nóiJulia chức năng lập luận bằng cách tham khảo

Trong Julia, tất cả các đối số cho chức năng này thông qua tham khảo.

vì vậy tôi đã khá ngạc nhiên khi thấy một sự khác biệt trong hành vi của hai chức năng:

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 

đây là sản phẩm bất ngờ khác nhau:

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 

nếu mảng được thông qua tham khảo, tôi đã mong đợi foo! để thay đổi số không thành số 0.

Trả lời

13

r=r+1 là một Phân tuyên bố , điều này có nghĩa nó reallocates r, vì vậy nó không còn đề cập đến cặp của nó trong phạm vi phụ huynh. nhưng r[i]=r[i]+1Biến đổi giá trị r, đột biến khác với nhiệm vụ (a good description here) và sau đó r vẫn đề cập đến biến cặp của nó trong phạm vi gốc.

8

Tôi nghĩ tài liệu hơi mơ hồ ở đây.

Nói đúng, Julia là "giá trị theo từng giá trị mà giá trị là tham chiếu" hoặc "chia sẻ cuộc gọi", được sử dụng bởi hầu hết các ngôn ngữ như python, java, ruby, js ... wiki

Cuộc gọi bằng cách thực hiện tham chiếu thực sự sẽ làm cho foo! thay đổi số 0 thành số 0. Tuy nhiên, Julia không ủng hộ điều đó. (Nếu bạn biết C#, đó là những gì ref hoặc out không)

+1

Tôi cũng thấy thuật ngữ 'call-by-pointer' (hoặc 'pass-by-pointer') được sử dụng để tham chiếu đến điều này, ngắn và cho điểm. Trong mọi trường hợp, nó luôn đáng nhắc nhở rằng các điều khoản được sử dụng đôi khi vì mục đích của lý thuyết ngôn ngữ, đôi khi cho mục đích thực hành. Và những ý nghĩa đó không phải lúc nào cũng trùng hợp, hoặc thậm chí khác nhau trong một kỷ luật tùy thuộc vào tác giả! –

Các vấn đề liên quan