Julia 可变结构中的变量字段名

Con*_*nor 4 struct field-names julia

我希望能够使用变量从 Julia 中的可变结构中获取字段。

例如

mutable struct myType
    my_field1::Int = 1
    my_field2::Int = 2
    my_field3::Int = 3
end
Run Code Online (Sandbox Code Playgroud)

然后让我们假设您使用以下命令声明此结构的特定实例 struct_instance = myType()

如何以可变方式从这个可变结构的实例中提取字段的值?

假设您想使用 for 循环将 my_struct.field[X] 的值分配给变量,以便您当前访问的特定字段取决于变量 X:

foo = zeros(Int64, 3)
for X = 1:3
    foo(X) = struct_instance.field[X]
end
Run Code Online (Sandbox Code Playgroud)

我不知道如何实际实现上面的 for 循环——我上面写的只是上面的伪代码。在 MATLAB 中,您将使用以下符号,例如:

foo = zeros(1,3)
for x = 1:3
    foo(x) = struct_instance.(sprintf('field%d',x))
end
Run Code Online (Sandbox Code Playgroud)

提前致谢。

mig*_*raz 5

从结构中获取字段的函数是fieldnames

julia> mutable struct A
       x
       y
       z
       end

julia> fieldnames(A)
(:x, :y, :z)
Run Code Online (Sandbox Code Playgroud)

要以编程方式设置这些字段值*,您可以使用setproperty!

julia> a = A(1,1,1)
A(1,1,1)

julia> a.x
1

julia> setproperty!(a, :x, 2)
2

julia> a.x
2
Run Code Online (Sandbox Code Playgroud)

使用 for 循环,

julia> for i in fieldnames(A)
           setproperty!(a, i, 3)
       end

julia> a
A(3,3,3)
Run Code Online (Sandbox Code Playgroud)

  • ~还值得一提的是 `propertynames` 和 `getproperty` - 有了它,您可以模仿字段的所有行为。〜此外,要显式使用 _fields_,您可以使用 `getfield` 和 `setfield!`,它们是一般不会超载。这允许您访问结构体的字段,而不仅仅是公开的属性。 (2认同)

Prz*_*fel 5

要使示例开头的代码正常工作,您需要该Paramaters包,否则您将无法使用默认值(示例中的代码会引发错误)。我经常在需要struct使用 a 来表示一堆变量的情况下使用它。

using Parameters

@with_kw mutable struct MyType
    my_field1::Int = 1
    my_field2::Int = 2
    my_field3::Int = 3
end
Run Code Online (Sandbox Code Playgroud)

这还会生成一组关键字方法,可用于在创建对象时以编程方式设置字段。看看下面的代码:

julia> vals = [Symbol("my_field$i") =>10i for i in 2:3 ]
2-element Array{Pair{Symbol,Int64},1}:
 :my_field2 => 20
 :my_field3 => 30

julia> MyType(;vals...)
MyType
  my_field1: Int64 1
  my_field2: Int64 20
  my_field3: Int64 30
Run Code Online (Sandbox Code Playgroud)

我们在这里创建了一组字段名称,现在我们在创建对象时使用它。当您可以考虑使用不可变对象而不是可变对象(不可变对象总是要快得多)时,这种方法特别有用。

您可以使用setfield!以下方法改变对象:

julia> for i in 1:2
           setfield!(m,Symbol("my_field$i"), 20i)
       end
julia> m
MyType
  my_field1: Int64 20
  my_field2: Int64 40
  my_field3: Int64 30
Run Code Online (Sandbox Code Playgroud)

我认为,当您来自 Matlab 时,这将是布局structs的最便捷方式。

  • 对于记录,您还可以按数字索引字段,例如“setfield(m, 2, 15)”。 (2认同)