迭代器 collect 返回 Any 类型怎么更改

问题:定义类型的迭代规则后,执行 collect 返回 Any 类型列表。但更合适的返回结果是 Vector{Int},除了派发 collect,有其他方法来设置返回类型吗?

举个栗子

struct Foo data::Vector{Int} end
import Base: length, iterate
length(p::Foo) = length(p.data)
iterate(p::Foo) = iterate(p.data)
iterate(p::Foo, i) = iterate(p.data, i)

执行 collect

julia> foo = Foo([1,2,3]);collect(foo)
3-element Vector{Any}:
 1
 2
 3

map ,列表生成器或迭代器都能够正常返回 Int,比如

julia> collect(i for i in foo)
3-element Vector{Int64}:
 1
 2
 3

另外,用 @edit 查看,背后调用了两个函数

# @edit collect(foo))
collect(itr) = _collect(1:1 #= Array =#, itr, IteratorEltype(itr), IteratorSize(itr))

修改 eltype 即可

Extend Base.eltype method, 这个在 doc 里面有写你需要实现 implement 哪些 methods

Base.eltype(::Foo) = Int
julia> foo = Foo([1,2,3])
Foo([1, 2, 3])

julia> collect(foo)
3-element Vector{Int64}:
 1
 2
 3
1 个赞