2015-10-04 16 views
7

Tham khảo Julia doc:Julia-Lang vô danh vs hành vi chức năng có tên trong thông qua lập luận

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

Khi tôi nhận được địa chỉ bộ nhớ của đối số Float64 từ một hàm ẩn danh, có vẻ như đúng. nhưng nó không đúng đối với một hàm được đặt tên.

test = function (a::Float64) 
    println(pointer_from_objref(a)); 
end 
# => (anonymous function) 
function test1(a::Float64) 
    println(pointer_from_objref(a)); 
end 
# => test1 (generic function with 1 method) 
value=0.0; 
println(pointer_from_objref(value)) 
# => Ptr{Void} @0x00007fe797c5c020 
test(value) 
# => Ptr{Void} @0x00007fe797c5c020 
test1(value) 
# => Ptr{Void} @0x00007fe799e83960 

như @Gnimuc đề cập, có một đoạn từ Julia-Lang Doc giải thích Luận Đi qua hành vi

Julia đối số chức năng theo một quy ước đôi khi được gọi “pass-by-chia sẻ” , có nghĩa là các giá trị không được sao chép khi chúng được chuyển đến các hàm. Đối số chức năng tự hoạt động như mới ràng buộc biến (vị trí mới có thể tham chiếu đến giá trị), nhưng giá trị mà chúng tham chiếu giống hệt với giá trị được truyền.

Có bất kỳ mối liên hệ nào giữa hành vi "chia sẻ thông qua" và mã trên không?

+1

AFAIK tất cả các đối số cho hàm được thông qua tham khảo với ngoại lệ dữ liệu đơn giản như số và ký tự. Cố gắng thay đổi số phao của bạn bên trong các chức năng này ... Đồng thời bạn đã tìm thấy một cái gì đó mâu thuẫn với quy tắc đó. Câu hỏi rất thú vị. Tôi mong được thấy câu trả lời. –

+3

từ [doc] (http://docs.julialang.org/en/latest/manual/functions/#argument-passing-behavior): "Các đối số chức năng hoạt động như các ràng buộc biến mới (các vị trí mới có thể tham chiếu đến các giá trị) , nhưng các giá trị mà chúng đề cập đến giống hệt với các giá trị được truyền. " Tôi tự hỏi thuật ngữ 'vị trí' có ý nghĩa gì ở đây. – Gnimuc

Trả lời

0

Từ tài liệu Julia cho pointer_from_objref(object_instance) chức năng chúng tôi có được mô tả này:

Lấy địa chỉ bộ nhớ của một đối tượng Julia như một PTR. Sự tồn tại của Ptr kết quả sẽ không bảo vệ đối tượng khỏi việc thu gom rác thải, vì vậy bạn phải đảm bảo rằng đối tượng vẫn được tham chiếu cho toàn bộ thời gian mà Ptr sẽ được sử dụng.

Kiểm tra thử nghiệm sau đây:

x=10 
y=10 
println(pointer_from_objref(x)) # => Ptr{Void} @0x039ee2c0 
println(pointer_from_objref(y)) # => Ptr{Void} @0x039ee2c0 

Như chúng ta có thể thấy pointer_from_objref thất bại trong việc trở về địa chỉ nguồn gốc của các đối tượng bất biến và điều này là bởi vì đối tượng này đang đi qua giá trị, vì vậy tôi nghĩ câu trả lời cho câu hỏi trên là pointer_from_objref đã bị lạm dụng ở đó.

0

Mở rộng câu trả lời của Reza, điều cần lưu ý ở đây là lý do "chia sẻ thông qua" không áp dụng cho các đối tượng không thay đổi. Nếu bạn cố gắng cùng mã nhưng sử dụng một vector phao như một tham số bạn làm được những hành vi dự kiến, tức là tất cả các con trỏ đều giống nhau:

test = function (a::Vector{Float64}) 
     println(pointer_from_objref(a)); 
    end 

    # => (anonymous function) 
    function test1(a::Vector{Float64}) 
     println(pointer_from_objref(a)); 
    end 

    # => test1 (generic function with 1 method) 
    value=[0.0,0.1]; 

    println(pointer_from_objref(value)) 
    # => Ptr{Void} @0x0000000084601be0 
    test(value) 
    # => Ptr{Void} @0x0000000084601be0 
    test1(value) 
    # => Ptr{Void} @0x0000000084601be0 
Các vấn đề liên quan