朱莉娅自定义类型分配

时间:2016-07-10 07:38:44

标签: types iterator julia

我尝试在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上的单个元素。就是这样。

2 个答案:

答案 0 :(得分:4)

赋值使用迭代器协议,因此需要为该类型实现startdonenext

关于样式,类型名称的注释应以大写字母开头,字段最好是性能的具体类型。在下文中,我在T中引入了一个类型参数Foo。 T可以是任何类型,但Foo的字段具有相同的类型。如果这是限制性附加类型参数,可以引入或者可以为每个字段分配一个具体类型。

以下示例针对类型start

实施donenextFoo
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))