如何在Julia中复制一个结构体

5

我想要对一个结构体进行浅复制,仅复制其值但保留其中的集合引用。但似乎没有内置方法来完成此操作:

julia> mutable struct S
         x
           y
           end

julia> a = S(1, rand(2))
S(1, [0.792705, 0.582458])

julia> b = deepcopy(a)
S(1, [0.792705, 0.582458])

julia> b.y === a.y
false

julia>

julia> b = copy(a)
ERROR: MethodError: no method matching copy(::S)
Closest candidates are:
  copy(::Expr) at expr.jl:36
  copy(::BitSet) at bitset.jl:46
  copy(::Markdown.MD) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v0.7/Markdown/src/parse/parse.jl:30
  ...
Stacktrace:
 [1] top-level scope at none:0

julia> b.y === a.y # expect true
1个回答

6

定义你自己的结构体中copy应该意味着什么,例如:

Base.copy(s::S) = S(s.x, s.y)

似乎是您想要的。
julia> mutable struct S
           x
           y
       end

julia> Base.copy(s::S) = S(s.x, s.y)

julia> a = S(1, rand(2));

julia> b = copy(a);

julia> a.y === b.y
true

3
谢谢。我已经写了一个通用的 Base.copy(x::T) where T = T([getfield(x, k) for k ∈ fieldnames(T)]...) 函数,可以复制任何类型的对象。 - Phuoc
@Phuoc:使用你上面的浅拷贝和使用深拷贝 Base.copy(x::T) where T = T([deepcopy(getfield(x, k)) for k ∈ fieldnames(T)]...) 的目的是什么? - jjjjjj
@jjjjjj 不进行深拷贝的一个原因是如果子结构具有大量的内存占用,那么深拷贝将会很慢,并导致程序使用过多的内存。 - DavidS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接