【发布时间】:2022-03-01 18:11:56
【问题描述】:
我在 stackoverflow 和 Julia 文档中都找不到以下“设计问题”的答案:
假设我要定义以下对象
struct Person
birthplace::String
age::Int
end
由于Person 是不可变的,我很高兴没有人可以更改任何已创建的Person 的birthplace,尽管如此,这也意味着随着时间的推移,我也无法更改他们的age...
另一方面,如果我将类型 Person 定义为
mutable struct Person
birthplace::String
age::Int
end
我现在可以将它们设为age,但我没有以前在birthplace 上的安全性,任何人都可以访问并更改它。
目前我发现的解决方法如下
struct Person
birthplace::String
age::Vector{Int}
end
显然age 是一个单元素Vector。
我发现这个解决方案非常丑陋,而且绝对不是最理想的,因为我每次都必须用方括号访问年龄。
有没有其他更优雅的方式在一个对象中同时拥有不可变和可变字段?
也许问题是我错过了在struct 中让所有东西都可变或不可变的真正价值。如果是这样,你能解释一下吗?
【问题讨论】:
-
从您提出问题的方式来看,我认为您不关心创建具有正确年龄的新对象的
incrementage函数?例如incrementage(p::Person) = Person(p.birthplace, p.age+1); -
没错,我不想创建一个新对象。这个想法是一个从网络上获取一些信息并更新它的一些字段的对象。因为它会每 10 秒左右轮询一次,所以每次都创建一个新对象不是我想要的。但无论如何,谢谢!
-
您可以使用定制的内部构造函数让您完全控制可见/可变的内容,例如:stackoverflow.com/q/39133424/4183191(免责声明:无耻自己的问题的插头)
-
不错!我实际上来自 C++,因此我习惯了那种“类型”的对象。但这绝对不在语言哲学中,因此我不会走那条路。
标签: struct julia immutability mutable