我尝试在julia中为自定义类型分配多个元素。但是,我不知道该怎么做。或者换句话说,我想重载赋值运算符,以返回该类型中包含的所有元素的元组。
这是理想的行为:
type foo
a
b
end
(a,b) = foo(1,2)
a
> 1
以下是错误消息:
ERROR: LoadError: MethodError: `start` has no method matching start(::foo)
我的看法是我需要实现一些负责任务的迭代器,但我不知道该怎么做。
修改
我实现了" start(),done(),next()"功能。现在我担心如何仍然允许我分配类型而不是它的元素。
写作:
a, b = foo(1,2)
a
# returns
> 1
但是:
a = foo(1,2)
a
# returns
> foo(1,2)
太棒了。因此,朱莉亚认识到只有一个元素 等式的左手边(lhs)将返回右侧的类型并且具有' n' lhs上的元素将分配' n'来自的元素 类型。因此,如果要分配整个类型,则必须将类型分配给lhs上的单个元素。就是这样。
答案 0 :(得分:4)
赋值使用迭代器协议,因此需要为该类型实现start
,done
和next
。
关于样式,类型名称的注释应以大写字母开头,字段最好是性能的具体类型。在下文中,我在T
中引入了一个类型参数Foo
。 T可以是任何类型,但Foo的字段具有相同的类型。如果这是限制性附加类型参数,可以引入或者可以为每个字段分配一个具体类型。
以下示例针对类型start
done
,next
和Foo
type Foo{T}
x::T
y::T
z::T
end
Base.start(foo::Foo) = 1
Base.done(foo::Foo, i) = nfields(foo) < i
Base.next(foo::Foo, i) = getfield(foo, i), i+1
通过上面的实现,Foo的内容可以映射到不同的变量:
x, y, z = Foo(1, 2, 3)
作为奖励,Foo现在可以在forloop中迭代:
for i in Foo(1, 2, 3)
println(i)
end
答案 1 :(得分:1)
我不知道如何重载赋值运算符,但您可以使用此函数返回所有字段:
all_fields(x) = [x.(i) for i = 1:nfields(x)]
然后你可以做
(a,b) = all_fields(foo(1,2))