2016-08-13 11 views
5

W julia skąd wiemy, czy dany typ jest manipulowany przez wartość lub przez odniesienie?W julia funkcje: przekazywane przez odniesienie lub wartość?

w Javie na przykład (przynajmniej dla SDK):

  • podstawowych typów (tych, które mają nazwy zaczynające się od małych liter, jak „int”) są manipulowane przez wartość

  • Przedmioty (te, które mają nazwy zaczynające się od litery, jak „HashMap”) i tablice są manipulowane przez odniesienie

jest więc łatwo wiedzieć, co się dzieje typ zmodyfikowany w funkcji.

Jestem całkiem pewien, moje pytanie jest duplikatem, ale nie mogę znaleźć DUP ...

EDIT

ten kod:

function modifyArray(a::Array{ASCIIString,1}) 
    push!(a, "chocolate") 
end 

function modifyInt(i::Int) 
    i += 7 
end 

myarray = ["alice", "bob"] 
modifyArray(myarray) 
@show myarray 

myint = 1 
modifyInt(myint) 
@show myint 

powraca:

myarray = ASCIIString["alice","bob", "chocolate"] 
myint = 1 

co było dla mnie trochę mylące, a powodem dlaczego przesłałem to pytanie. Komentarz @Stefan Karpinski wyjaśnił problem.

Moje zamieszanie pochodziło z faktu, że postrzegam + = jako operatora, metodę taką jak push! który modyfikuje sam obiekt. ale to nie jest.

i += 7 należy postrzegać jako i = i + 7 (powiązanie z innym obiektem). Rzeczywiście zachowanie to będzie takie samo dla modifyArray, jeśli użyję na przykład a = ["chocolate"].

Odpowiedz

9

Odpowiednie warunki w Julia są mutable and immutable types:

  • niezmienne przedmiotów (albo bitstype S, taki jak Int lub typów złożonych deklarowano immutable, takie jak Complex) nie może być modyfikowana po utworzeniu i tak są przekazywane przez kopiowanie.

  • zmienne obiekty (tablice lub typy złożone zadeklarowane za pomocą type) są przekazywane przez odniesienie, więc można je modyfikować przez wywoływanie funkcji. Zgodnie z konwencją takie funkcje kończą się wykrzyknikiem (np. sort!), ale nie jest to egzekwowane przez język.

Należy jednak pamiętać, że niezmienny obiekt może zawierać zmienny obiekt, który nadal może być modyfikowany przez funkcję.

To jest .

+3

kluczem rzeczywistości jednak jest to, że wszystkie wartości są manipulowane przez odniesienie. – StefanKarpinski

+4

Zobacz także: http://stackoverflow.com/questions/33002572/creating-copies-in-julia-with-operator, http://stackoverflow.com/questions/35235597/julia-function-argument-by-reference. – StefanKarpinski

+0

@StefanKarpinski Dzięki, to jasne. Po prostu pomyliłem się ... Zmieniłem moje pytanie na wypadek, gdyby ktoś inny wpadł w tę samą pułapkę. –

3

Myślę, że odpowiedź najbardziej rygorystyczną jest jeden w

Julia function argument by reference

Ściśle mówiąc, Julia nie jest "call-by-reference" ale „call-by-value, gdzie wartość jest odniesienia”lub "call-by-sharing", stosowany przez większość języków takich jak Python, Java, Ruby ...

Powiązane problemy