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

Struct Julia可变结构中的变量字段名,struct,julia,field-names,Struct,Julia,Field Names,我希望能够使用变量从Julia中的可变结构中获取字段 e、 g 然后让我们假设您使用struct\u instance=myType() 如何以可变方式从这个可变结构的实例中提取字段的值 假设您希望使用for循环将my_struct.field[X]的值分配给变量,以便当前访问的特定字段取决于变量X: foo = zeros(Int64, 3) for X = 1:3 foo(X) = struct_instance.field[X] end 我不知道如何实际实现上面的for循环——我

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

e、 g

然后让我们假设您使用
struct\u instance=myType()

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

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

foo = zeros(Int64, 3)
for X = 1:3
    foo(X) = struct_instance.field[X]
end
我不知道如何实际实现上面的for循环——我上面写的只是上面的伪代码。在MATLAB中,您可以使用以下符号,例如:

foo = zeros(1,3)
for x = 1:3
    foo(x) = struct_instance.(sprintf('field%d',x))
end

提前感谢。

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

julia> mutable struct A
       x
       y
       z
       end

julia> fieldnames(A)
(:x, :y, :z)
要以编程方式设置这些字段值*,可以使用
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
使用for循环

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

julia> a
A(3,3,3)

要使示例开头的代码正常工作,您需要
Paramaters
包,否则您无法拥有默认值(示例中的代码会抛出错误)。我经常在需要一个
struct
来表示一组变量的情况下使用它

using Parameters

@with_kw mutable struct MyType
    my_field1::Int = 1
    my_field2::Int = 2
    my_field3::Int = 3
end
这还会生成一组关键字方法,可用于在创建对象时以编程方式设置字段。请查看以下代码:

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
我们在这里创建了一组字段名,现在在创建对象时使用它。当您可以考虑使用不可变对象而不是可变对象时,这种方法尤其有用(不可变的对象总是快得多)。 您可以使用
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

我认为,当您来自Matlab时,这将是布局
struct
s的最方便的方法。

在这种情况下,您要做的是在struct中创建一个变量:
my_字段
,并使该元素成为
向量{Int}
~可能还值得一提的是
propertynames
getproperty
-通过这一点,您可以模拟字段的所有行为。~此外,要明确处理字段,您可以使用
getfield
setfield,通常不会过载。这允许您访问结构的字段,而不仅仅是公开的属性。这很有帮助,但并不是我想象的那样。我想解决方案包括使用
getproperty!()
并传入字符串。我的意思是使用一个变量来生成一个字符串(我知道这将是一个可行的字段名),然后它本身将被用来访问字段(或者属性,我想是吧?)。在MATLAB中,这称为动态字段名。我并不是在使用变量更改访问哪个字段:字段本身的名称是使用变量生成的。然后我使用变量字段名(我想是作为字符串生成的)来访问结构的字段。谢谢!这正是我所寻找的——基本上,可以接受字符串作为输入的
Symbol
类型是我缺少的关键。另外,关于使用不可变对象与可变对象:如果字段本身是我希望随时间填充的数组,我是否仍然可以使用不可变对象?我使用可变对象是因为我想在应用程序中随时间更新字段的值。对于记录,您还可以按数字对字段进行索引,例如,
setfield(m,2,15)
@user13259528是的,您可以对作为不可变
结构
一部分的
数组
的元素进行变异,但不能对
数组
字段本身进行变异。Julia使用约定通过共享传递-看看这个线程:
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