gpt4 book ai didi

struct - Julia 结构中的可变字段

转载 作者:行者123 更新时间:2023-12-03 20:24:52 24 4
gpt4 key购买 nike

我在 stackoverflow 和 Julia 文档中都找不到以下“设计问题”的答案:

假设我要定义以下对象

struct Person
birthplace::String
age::Int
end

由于 Person是不可变的,我很高兴没有人可以更改 birthplace任何 Person然而,创建,这也意味着当时间流逝时,我无法改变他们的 age任何一个...

另一方面,如果我定义类型 Person作为
mutable struct Person
birthplace::String
age::Int
end

我现在可以制作它们 age ,但我没有以前在 birthplace 上的安全性,任何人都可以访问和更改它。

到目前为止我发现的解决方法如下
struct Person
birthplace::String
age::Vector{Int}
end

显然 age是 1 元素 Vector .
我发现这个解决方案非常丑陋,而且绝对不是最理想的,因为我每次都必须用方括号访问年龄。

有没有其他更优雅的方式在一个对象中同时拥有不可变和可变字段?

也许问题是我错过了在 struct 中让所有东西都可变或不可变的真正值(value)。 .如果是这样,你能给我解释一下吗?

最佳答案

您已经收到了一些有趣的答案,对于“玩具示例”案例,我喜欢存储出生日期的解决方案。但是对于更一般的情况,我可以想到另一种可能有用的方法。定义 Age作为它自己的可变结构,和 Person作为一个不可变的结构。那是:

julia> mutable struct Age ; age::Int ; end

julia> struct Person ; birthplace::String ; age::Age ; end

julia> x = Person("Sydney", Age(10))
Person("Sydney", Age(10))

julia> x.age.age = 11
11

julia> x
Person("Sydney", Age(11))

julia> x.birthplace = "Melbourne"
ERROR: type Person is immutable

julia> x.age = Age(12)
ERROR: type Person is immutable

请注意,我无法更改 Person 的任何一个字段,但我可以通过直接访问 age 来更改年龄可变结构中的字段 Age .您可以为此定义一个访问器函数,即:
set_age!(x::Person, newage::Int) = (x.age.age = newage)

julia> set_age!(x, 12)
12

julia> x
Person("Sydney", Age(12))
Vector 没有任何问题另一个答案中讨论的解决方案。它本质上完成了同样的事情,因为数组元素是可变的。但我认为上述解决方案更整洁。

关于struct - Julia 结构中的可变字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48401315/

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