2015-10-04 21 views
7

zobacz Julia Doc:Julia-Lang anonimowy vs nazwie zachowanie funkcji w przekazywaniu argumentu

W Julia, wszystkie argumenty funkcji są przekazywane przez referencję.

Kiedy otrzymam adres pamięci argumentu Float64 z anonimowej funkcji, wygląda on prawidłowo. ale nie jest to prawdą dla nazwanej funkcji.

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 

jak wspomniano @Gnimuc, istnieje inny ustęp od Julia-Lang Doc, który wyjaśnia argumentem przechodzącej zachowanie

argumenty funkcji Julia śledzić konwencja czasami nazywane „pass-by-sharing” , co oznacza, że ​​wartości nie są kopiowane po przekazaniu funkcji do funkcji . Argumenty funkcji same w sobie pełnią funkcję nowych powiązań zmiennych (nowe lokalizacje, które mogą odnosić się do wartości), ale wartości, do których się odnoszą, są identyczne z wartościami przekazanymi.

Czy istnieje związek między zachowaniem "przeprowadź przez dzielenie się" a powyższym kodem?

+1

AFAIK wszystkie argumenty funkcji są przekazywane przez odniesienie z wyjątkiem zwykłych danych, takich jak liczby i znaki. Spróbuj zmienić swój numer float w tych funkcjach ... W tym samym czasie znajdziesz coś, co jest sprzeczne z tą zasadą. Bardzo interesujące pytanie. Nie mogę się doczekać odpowiedzi. –

+3

od [doc] (http://docs.julialang.org/en/latest/manual/functions/#argument-passing-behavior): "Argumenty funkcji same działają jako nowe powiązania zmiennych (nowe lokalizacje, które mogą odnosić się do wartości) , ale wartości, do których się odnoszą, są identyczne z przekazanymi wartościami. " Zastanawiam się, co oznacza termin "lokalizacja". – Gnimuc

Odpowiedz

0

Z dokumentacji Julia na pointer_from_objref(object_instance) funkcji możemy uzyskać ten opis:

uzyskać adres pamięci obiektu Julia jako Ptr. Istnienie wynikowego Ptr nie ochroni obiektu przed zbędnym wyrzucaniem, , więc musisz upewnić się, że obiekt pozostaje odwołany przez cały czas, w którym zostanie użyty Ptr.

Sprawdź następujący test:

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

Jak widzimy pointer_from_objref nie zwróci natywną adres niezmiennych obiektów i to dlatego to obiekty są wprost przez wartość, więc myślę, że odpowiedź na powyższe pytanie jest to, że został tam użyty błąd pointer_from_objref.

0

Po rozwinięciu odpowiedzi Rezy, należy zauważyć, że rozumowanie "pass-by-sharing" nie odnosi się do niezmiennych obiektów. Jeśli spróbujesz tego samego kodu, ale użyjesz wektora zmiennych jako parametru, uzyskasz oczekiwane zachowanie, tj. Wszystkie wskaźniki są takie same:

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