在julia函数中:通过引用或值传递?

Iss*_* T. 10 julia

在julia中,我们如何知道某个类型是通过值还是通过引用来操纵的?

以java为例(至少对于sdk):

  • 基本类型(名称以小写字母开头的类型,如"int")由值操纵

  • 对象(名称以大写字母开头的对象,如"HashMap")和数组通过引用进行操作

因此很容易知道在函数内修改的类型会发生什么.

我很确定我的问题是重复但我找不到复制...

编辑

这段代码:

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
Run Code Online (Sandbox Code Playgroud)

回报:

myarray = ASCIIString["alice","bob", "chocolate"]
myint = 1
Run Code Online (Sandbox Code Playgroud)

这对我来说有点混乱,我之所以提交这个问题.@StefanKarpinski的评论澄清了这个问题.

我的困惑来自于我认为+ =作为操作员,像推的方法!这是修改对象本身.但事实并非如此.

i += 7应该被视为i = i + 7(与不同对象的绑定).实际上,modifyArray如果我使用例如,这种行为将是相同的a = ["chocolate"].

Sim*_*rne 13

Julia中的相应术语是可变不可变的类型:

  • 不可变对象(bitstypes,Int或诸如声明的复合类型immutableComplex)在创建后不能修改,因此通过复制传递.

  • 可变对象(数组或声明的复合类型type)通过引用传递,因此可以通过调用函数进行修改.按照惯例,这些函数以感叹号(例如sort!)结束,但这不是由语言强制执行的.

但请注意,不可变对象可以包含可变对象,该对象仍可由函数修改.

在FAQ中有更详细的解释.

  • 另见:http://stackoverflow.com/questions/33002572/creating-copies-in-julia-with-operator,http://stackoverflow.com/questions/35235597/julia-function-argument-by-reference. (4认同)
  • 然而,关键的事实是所有的价值都是通过参考来操纵的. (3认同)