在 Julia 中,我们如何知道一个类型是通过值还是通过引用来操作的?
例如在java中(至少对于sdk):
因此很容易知道在函数内部修改的类型会发生什么。
我很确定我的问题是重复的,但我找不到重复的...
编辑
这段代码:
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
(绑定(bind)到不同的对象)。事实上,这种行为对于 modifyArray
是相同的。如果我使用例如 a = ["chocolate"]
.
最佳答案
Julia 中对应的术语是 mutable和 immutable types :
bitstype
s,例如 Int
或用 immutable
声明的复合类型,例如 Complex
)一旦创建就无法修改,因此通过复制传递。 type
声明的复合类型)通过引用传递,因此可以通过调用函数来修改。按照惯例,此类函数以感叹号结尾(例如 sort!
),但这不是由语言强制执行的。 但是请注意,不可变对象(immutable对象)可以包含可变对象,该对象仍然可以被函数修改。
这是explained in more detail in the FAQ .
关于julia - 在 Julia 功能: passed by reference or value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936868/