假设我有一些不可变的结构,例如
struct Person
name::Symbol
age::Int
end;
Run Code Online (Sandbox Code Playgroud)
我想写一个函数
function copyWithModification(original_person::Person, fieldToChange::String, valueForNewField)::Person
Run Code Online (Sandbox Code Playgroud)
返回一个新的 Person 结构,就像旧的那样,除了 fieldToChange 中指定的字段的值已设置为 valueForNewField。我该怎么做呢?
我当前的尝试使用Setfield和元编程
using Setfield
function copyWithModification(original_person::Person, fieldToChange::String, valueForNewField)::Person
return eval(Meta.parse("@set original_person." * fieldToChange * " = " * string(valueForNewField)))
end
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为 eval 是在全局范围内执行的,因此无法访问original_person对象:
julia> struct Person
name::Symbol
age::Int
end;
julia> using Setfield
julia> function copyWithModification(original_person::Person, fieldToChange::String, valueForNewField)::Person
return eval(Meta.parse("@set original_person." * fieldToChange * " = " * string(valueForNewField)))
end
copyWithModification (generic function with 1 method)
julia> person_local_scope = Person(:test, 10)
Person(:test, 10) …Run Code Online (Sandbox Code Playgroud)