首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Julia中可变类型字段理解不可变组合类型

用Julia中可变类型字段理解不可变组合类型
EN

Stack Overflow用户
提问于 2014-12-09 03:53:09
回答 1查看 2.7K关注 0票数 10

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

设置:I有一个复合类型,如下所示:

代码语言:javascript
运行
复制
type MyType
    x::Vector{String}
end

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

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

我的理解:我已经阅读过关于这方面的朱莉娅博士,以及关于Stackoverflow (例如这里这里)的更一般的问题(例如,这里这里),但从实际的角度来看,对于可变/不可变(特别是对于包含不可变类型的可变数组的不可变组合类型),我仍然没有很好的处理能力!

然而,我的尝试是:如果MyType是不可变的,那么它意味着字段x必须始终指向同一个对象。该对象本身(Strings的向量)是可变的,所以我完全可以在其中插入新元素。不允许我做的是尝试更改MyType,以便字段x指向一个完全不同的对象。例如,执行以下操作的方法是可以的:

代码语言:javascript
运行
复制
MyType.x[1] = "NewValue"
push!(MyType.x, "NewElementToAdd")

但是,执行以下操作的方法是不合适的:

代码语言:javascript
运行
复制
MyType.x = ["a", "different", "string", "array"]

是这样的吗?此外,锁定不可变类型字段值的对象是否是在构造函数中创建的对象?

最后一点:如果这似乎重复了其他问题,我很抱歉。如前所述,我已经看穿了它们,无法得到我想要的理解。

EN

回答 1

Stack Overflow用户

发布于 2014-12-09 04:34:53

因此,这里有一些需要考虑的事情(至少对我来说是这样):

代码语言:javascript
运行
复制
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地址实际上正在发生变化!但是-你自己不能改变数据,就像你指出的。

我不确定有一个百分之百正确的答案是真的。在某些性能关键的情况下,我主要将immutable用于简单类型,如docs中的Complex示例,并且出于“防御性编程”的原因,例如,代码不需要写入这种类型的字段,所以这样做是错误的。当类型是数字的一种扩展时,它们是一个很好的选择,例如ComplexRGBColor,我用它们来代替元组,作为一种命名元组(元组现在似乎在朱莉娅身上表现得不太好,那里的不可变类型执行得很好)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27371153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档