julia - 在 Julia 功能: passed by reference or value?

标签 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
    

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

    这让我有点困惑,以及我提交这个问题的原因。 @StefanKarpinski 的评论澄清了这个问题。

    我的困惑来自于我认为 += 作为一个操作符,一种类似于 push 的方法!这是修改对象本身。但事实并非如此。
    i += 7应视为 i = i + 7 (绑定(bind)到不同的对象)。事实上,这种行为对于 modifyArray 是相同的。如果我使用例如 a = ["chocolate"] .

    最佳答案

    Julia 中对应的术语是 mutableimmutable types :

  • 不可变对象(immutable对象)(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/

    相关文章:

    overloading - 如何在 Julia 中重载 +=?

    arrays - 如何提高 Julia 中嵌套数组的速度?

    arrays - 按包含字符串的列之一对 Julia 1.1 矩阵进行排序

    replace - 如何替换Julia中字符串中的多个字符

    julia - 离散连续概率分布

    optimization - Julia 中最小二乘坐标下降算法不收敛

    julia - Julia 中模块和结构之间的名称冲突

    julia - 如何获取给定模块导入的模块列表

    c++ - 如何在 c++ (visual studio) 中使用 julia 语言

    julia - 如何从 Julia 0.4-pre 中的 now() 获得毫秒数?