Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
julia函数中:按引用还是按值传递?_Julia - Fatal编程技术网

julia函数中:按引用还是按值传递?

julia函数中:按引用还是按值传递?,julia,Julia,在julia中,我们如何知道类型是由值还是由引用操纵的 以java为例(至少对于sdk): 基本类型(名称以小写字母开头的类型,如“int”)由值操纵 对象(名称以大写字母开头的对象,如“HashMap”)和数组通过引用进行操作 因此,很容易知道在函数内部修改的类型会发生什么情况 我很确定我的问题是重复的,但我找不到重复的 编辑 此代码: function modifyArray(a::Array{ASCIIString,1}) push!(a, "chocolate") end

在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
返回:

myarray = ASCIIString["alice","bob", "chocolate"]
myint = 1
这让我有点困惑,以及我提出这个问题的原因。@StefanKarpinski的评论澄清了这个问题

我的困惑源于这样一个事实:我将+=视为一个操作符,一个类似push的方法!它正在修改对象本身。但事实并非如此


i+=7
应被视为
i=i+7
(与不同对象的绑定)。实际上,如果我使用例如
a=[“chocolate”]
中的相应术语,那么
modifyArray的这种行为将与
相同

  • 不可变对象(无论是
    bitstype
    s,如
    Int
    ,还是用
    immutable
    声明的复合类型,如
    Complex
    )在创建后都无法修改,因此通过复制传递

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

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


这是。

我认为最严格的答案是

严格地说,Julia不是“通过引用调用”,而是“通过值调用,其中值是 “引用”,或“通过共享调用”,如 python、java、ruby


然而,关键的事实是,所有的值都是通过引用操作的。另请参见:,。@StefanKarpinski谢谢,这一点很清楚。我刚才把自己搞糊涂了。。。我已经编辑了我的问题,以防其他人也陷入同样的困境,只是指出“不可变对象[…]通过复制传递”的语句仅适用于
isbits
类型。e、 g.
a=“你好”;f(x)=指针(x);指针(a)==f(a)#true,通过引用传递
。只是它们是不可变的,所以在一个函数中你不能对它们做很多事情。但是如果你真的想改变它,你可以通过不安全的指针等来改变它,所以区别很重要。另外,某些不可变的对象是通过复制来传递的,这是一个实现细节。从用户的角度来看,所有参数都是通过共享传递的。