Julia 可变结构中的变量字段名
Variable fieldnames in Julia mutable structs
我希望能够使用变量从 Julia 中的可变结构中获取字段。
例如
mutable struct myType
my_field1::Int = 1
my_field2::Int = 2
my_field3::Int = 3
end
然后假设您使用 struct_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 的最方便的方式。
我希望能够使用变量从 Julia 中的可变结构中获取字段。
例如
mutable struct myType
my_field1::Int = 1
my_field2::Int = 2
my_field3::Int = 3
end
然后假设您使用 struct_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 的最方便的方式。