我尝试从 Julia 中的自定义类型分配多个元素。但是我不知道该怎么做。或者换句话说,我想重载赋值运算符以返回该类型中包含的所有元素的元组。
这是所需的行为:
type foo
a
b
end
(a,b) = foo(1,2)
a
> 1
这是错误消息:
ERROR: LoadError: MethodError: `start` has no method matching start(::foo)
我的看法是,我需要实现某种负责分配的迭代器,但我不知道该怎么做。
EDIT
我实现了“start()、done()、next()”函数。现在我担心如何仍然允许我分配类型而不是它的元素。
Writing:
a, b = foo(1,2)
a
# returns
> 1
however:
a = foo(1,2)
a
# returns
> foo(1,2)
这太棒了。因此,朱莉娅认识到,有一个单一的元素
等式的左侧 (lhs) 将返回右侧的类型,并且 lhs 上有“n”个元素将从中分配“n”个元素
类型。因此,如果您想分配整个类型,则必须将该类型分配给 lhs 上的单个元素。就是这样。
该分配使用迭代器协议,因此start
, done
and next
需要针对类型来实现。
关于样式、类型名称的注释应以大写字母开头,并且字段最好是具体类型以提高性能。下面我介绍了一个类型参数T
in Foo
。 T 可以是任何类型,但 Foo 的字段具有相同的类型。如果这是限制性的附加类型参数,可以引入或者可以为每个字段分配一个具体类型。
下面的例子实现了start
, done
and 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)
作为奖励,现在可以在 forloop 中迭代 Foo,如下所示:
for i in Foo(1, 2, 3)
println(i)
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)