Types 自定义类型赋值
我尝试从julia中的自定义类型分配多个元素。但是我不知道怎么做。或者换句话说,我想重载赋值操作符,以返回类型中包含的所有元素的元组 以下是所需的行为: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) 我的想法是我需要实现某种迭代器来处理赋值,但我不知道怎么做 编辑 我实
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