2015-10-04 16 views
7

Fare riferimento a Julia doc:Julia-Lang anonima vs comportamento funzione denominata nel passare argomento

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

Quando ottengo l'indirizzo di memoria di un argomento Float64 da una funzione anonima, sembra giusto. ma non è vero per una funzione con nome.

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 

come detto @Gnimuc, c'è un altro punto da Julia-Lang Doc che spiega Argomento Passando Comportamento

argomenti della funzione Julia seguono una convenzione a volte chiamato “pass-by-sharing” , il che significa che i valori non vengono copiati quando vengono trasferiti alle funzioni . Gli stessi argomenti delle funzioni agiscono come nuovi collegamenti alle variabili (nuove posizioni che possono fare riferimento ai valori), ma i valori a cui si riferiscono sono identici ai valori passati.

C'è qualche relazione tra questo comportamento "pass-by-sharing" e il codice sopra?

+1

AFAIK tutti gli argomenti di una funzione vengono passati per riferimento, ad eccezione di dati semplici come numeri e caratteri. Prova a cambiare il tuo numero float all'interno di queste funzioni ... Allo stesso tempo hai trovato qualcosa che contraddice quella regola. Domanda molto interessante Non vedo l'ora di vedere una risposta. –

+3

da [doc] (http://docs.julialang.org/en/latest/manual/functions/#argument-passing-behavior): "Gli stessi argomenti delle funzioni fungono da nuove associazioni di variabili (nuove posizioni che possono riferirsi ai valori) , ma i valori a cui si riferiscono sono identici ai valori passati. " mi chiedo cosa significhi il termine "posizione" qui. – Gnimuc

risposta

0

Dalla documentazione Julia per pointer_from_objref(object_instance) funzione otteniamo questa descrizione:

ottenere l'indirizzo di memoria di un oggetto Julia come Ptr. L'esistenza di Ptr risultante non proteggerà l'oggetto dalla garbage collection, , quindi è necessario assicurarsi che l'oggetto rimanga referenziato per l'intera durata di in cui verrà utilizzato il Ptr.

Controllare il seguente test:

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

Come possiamo vedere pointer_from_objref non riesce a restituire l'indirizzo nativo di oggetti immutabili e questo perché questi oggetti sono passaggio per valore, quindi penso che la risposta per domanda di cui sopra è che pointer_from_objref è stato abusato lì.

0

Espansione della risposta di Reza, la cosa da notare qui è che il ragionamento "pass-by-sharing" non si applica agli oggetti immutabili. Se si tenta lo stesso codice, ma utilizzando un vettore di carri come parametro si vuole ricevere il comportamento previsto, vale a dire, tutti i puntatori sono gli stessi:

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 
Problemi correlati