小编Por*_*dow的帖子

Julia:如何通过修改用户提供的字段中的原始不可变结构来生成新的不可变结构?

假设我有一些不可变的结构,例如

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)

struct metaprogramming julia

3
推荐指数
1
解决办法
829
查看次数

标签 统计

julia ×1

metaprogramming ×1

struct ×1