gpt4 book ai didi

immutability - 了解 Julia 中具有可变类型字段的不可变复合类型

转载 作者:行者123 更新时间:2023-12-04 04:11:05 25 4
gpt4 key购买 nike

初始注释:我在 Julia 工作,但这个问题可能适用于许多语言。

设置:我有一个复合类型如下:

type MyType
x::Vector{String}
end

我写了一些方法来操作 MyType .例如,我编写了一个方法,允许我在 x 中插入一个新元素。 ,例如 function insert!(d::MyType, itemToInsert::String) .

问题:MyType是可变的还是不可变的?

我的理解:我已阅读 Julia docs关于这一点,以及关于 Stackoverflow 的更一般(和高度赞成)的问题(例如 herehere ),但我仍然没有很好地处理从实际操作中可变/不可变意味着什么透视(特别是对于不可变复合类型的情况,包含不可变类型的可变数组!)

尽管如此,这是我的尝试:如果 MyType是不可变的,那么这意味着该字段 x必须始终指向同一个对象。该对象本身(字符串向量)是可变的,因此我可以向其中插入新元素。我不允许做的是尝试改变 MyType使字段 x指向一个完全不同的对象。例如,执行以下操作的方法是可以的:
MyType.x[1] = "NewValue"
push!(MyType.x, "NewElementToAdd")

但是执行以下操作的方法不行:
MyType.x = ["a", "different", "string", "array"]

这是正确的吗?另外,不可变类型字段值锁定的对象是在构造函数中创建的对象的想法吗?

最后一点:如果这似乎与 SO 上的其他问题重复,我深表歉意。如上所述,我已经浏览了它们,但无法理解我所追求的。

最佳答案

所以这里有一些事情需要考虑(至少对我来说):

julia> immutable Foo
data::Vector{Float64}
end

julia> x = Foo([1.0, 2.0, 4.0])
Foo([1.0,2.0,4.0])

julia> append!(x.data, x.data); pointer(x.data)
Ptr{Float64} @0x00007ffbc3332018

julia> append!(x.data, x.data); pointer(x.data)
Ptr{Float64} @0x00007ffbc296ac28

julia> append!(x.data, x.data); pointer(x.data)
Ptr{Float64} @0x00007ffbc34809d8

所以 data地址实际上随着向量的增长而改变,需要重新分配!但是 - 正如您所指出的,您不能自己更改数据。

我不确定是否有 100% 正确的答案。我主要使用 immutable对于简单类型,如 Complex在某些性能关键情况下的文档中的示例,我出于“防御性编程”的原因而这样做,例如代码不需要写入这种类型的字段,所以我这样做是错误的。每当类型是数字的一种扩展时,它们都是 IMO 的不错选择,例如 Complex , RGBColor ,我用它们代替元组,作为一种命名元组(无论如何,元组现在似乎在 Julia 中表现不佳,其中不可变类型表现出色)。

关于immutability - 了解 Julia 中具有可变类型字段的不可变复合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com