Types 自定义类型赋值

Types 自定义类型赋值,types,iterator,julia,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) 我的想法是我需要实现某种迭代器来处理赋值,但我不知道怎么做 编辑 我实

我尝试从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)
这太棒了。因此,julia认识到,在 等式的左侧(lhs)将返回右侧的类型,左侧有“n”个元素将从
类型。因此,如果要指定整个类型,则必须将该类型指定给lhs上的单个元素。就这样

我不知道如何重载赋值运算符,但您可以使用此函数返回所有字段:

all_fields(x) = [x.(i) for i = 1:nfields(x)]
那你就可以了

(a,b) = all_fields(foo(1,2))

分配使用迭代器协议,因此需要为类型实现
start
done
next

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

下面的示例为类型
Foo
实现
start
done
next

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
作为奖励,现在可以在forloop中迭代Foo,如下所示:

for i in Foo(1, 2, 3)
    println(i)
end

很不错的。谢谢。谢谢。这就是我要找的。这段代码会不会因为
Foo.x!=1
,它不应该是
Base.start(foo;:foo)=1
,因为
Base.start
返回初始迭代器状态,而不是值。
for i in Foo(1, 2, 3)
    println(i)
end