我无法在stackoverflow和Julia文档中找到以下"设计问题"的答案:
假设我想定义以下对象
struct Person
birthplace::String
age::Int
end
Run Code Online (Sandbox Code Playgroud)
既然Person是不可改变的,我很高兴没有人可以改变birthplace任何Person创造的,但是,这也意味着当时间过去,我无法改变他们的age......
另一方面,如果我将类型定义Person为
mutable struct Person
birthplace::String
age::Int
end
Run Code Online (Sandbox Code Playgroud)
我现在可以制作它们age,但我没有以前的安全性birthplace,任何人都可以访问并更改它.
到目前为止我找到的解决方法如下
struct Person
birthplace::String
age::Vector{Int}
end
Run Code Online (Sandbox Code Playgroud)
显然age是1元素Vector.
我发现这个解决方案非常难看并且绝对不是最理想的,因为每次都必须使用方括号访问年龄.
是否还有其他更优雅的方法在对象中包含不可变字段和可变字段?
也许问题是我错过了在一个内容中具有可变性或不可变性的真正价值struct.如果是这样的话,你能解释一下吗?
我有两个名为CreationOperator和的具体类型AnnihilationOperator,我想定义一个新的具体类型,它表示一串运算符和一个与其相乘的实数系数。
我发现定义一个抽象类型很自然FermionicOperator, 和 都CreationOperator从中AnnihilationOperator继承,即
abstract type FermionicOperator end
struct CreationOperator <: FermionicOperator
...
end
struct AnnihilationOperator <: FermionicOperator
...
end
Run Code Online (Sandbox Code Playgroud)
因为我可以用 类型的签名定义许多函数,例如算术运算(我正在构建一个代数系统,所以我必须在运算符上function(op1::FermionicOperator, op2::FermionicOperator) = ...定义诸如 、 等操作*) 。
然后我会继续定义一个具体类型+OperatorString
struct OperatorString
coef::Float64
ops::Vector{FermionicOperator}
end
Run Code Online (Sandbox Code Playgroud)
然而,根据 Julia 手册,我认为这OperatorString对于性能来说并不理想,因为编译器对此一无所知FermionicOperator,因此涉及的函数OperatorString将效率低下(并且我将有许多操作运算符字符串的函数)。
我找到了以下解决方案,但是我不确定它的含义以及它是否真的有所作为。
我没有将其定义FermionicOperator为抽象类型,而是将其定义为UnionofCreationOperator和AnnihilationOperator,即
struct CreationOperator
...
end
struct AnnihilationOperator
...
end
FermionicOperator = Union{CreationOperator,AnnihilationOperator} …Run Code Online (Sandbox Code Playgroud)