Julia中的变异函数(修改其参数的函数)

A.Y*_*iha 10 julia

如何在Julia中定义变异函数,您希望将结果写入其中一个输入.

我知道函数存在push!(list, a),它们会改变它们的输入但是如何使用感叹号定义我自己的一个.

Lyn*_*ite 16

!只是一个惯例; 它不是变异功能的必要条件.

任何函数都可以改变其输入.但是很明显,它正在这样做,我们用一个后缀!.

但是,要变异的输入必须是可变的.其中包括Strings,Tuples,Int64s,Float32s等.以及使用immutable关键字定义的自定义类型.

大多数类型都是可变的,比如Vectors.但您确实需要确保更改其内容,而不是对它们的引用.

比如说,我们想要创建一个函数,用数字2替换向量的所有元素.(这fill!(v,2)是执行此操作的Base方法.但是例如,为了这个例子)

什么会奏效

改变v包含的内容:

function right1_fill_with_twos!(v::Vector{Int64})
    v[:]=[2 for ii in 1:length(v)]
end
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

function right2_fill_with_twos!(v::Vector{Int64})
    for ii in 1:length(v)
        v[ii]=2
    end
    v 
end
Run Code Online (Sandbox Code Playgroud)

什么是行不通的:

正在改变这个名字v指向的东西

function wrong1_fill_with_twos!(v::Vector{Int64})
    v=[2 for ii in 1:length(v)]
end
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

function wrong2_fill_with_twos!(v::Vector{Int64})
    u = Vector{Int64}(length(v))
    for ii in 1:length(v)
        u[ii]=2
    end
    v = u 
end
Run Code Online (Sandbox Code Playgroud)

你不能修改不可变变量(比如Int64s)的原因是因为它们没有要修改的内容 - 它们是它们自己的内容.

这个概念必须更改传入函数的变量的内容,而不是更改名称绑定的内容(替换对象),这在许多编程语言中是相当标准的.它来自pass by value,其中一些值是引用.我听说它在Java中称为黄金法则(参考文献)