Juliaインタフェース:Iterationインタフェース-反復


1、紹介
juliaが提供する様々なインタフェースは、カスタムタイプ拡張機能です.ここでは、Iterationインタフェースについて説明します.カスタムタイプインプリメンテーションここでインタフェースは反復機能を実現することができます.つまり、forループで直接使用することができます.iterがカスタムタイプである場合:
for i in iter   # or  "for i = iter"
    # body
end

同等:
next = iterate(iter)
while next !== nothing
    (i, state) = next
    # body
    next = iterate(iter, state)
end 

2、実現方法
Iterationインタフェースを実装するにはiterate(iter,state)メソッドを実装する必要があります.このメソッドはBaseパッケージにあり、iterの次の要素とその状態stateを返すことを意味し、なければnothingを返すと、stateはインデックスになります.countドメインを持つタイプSquaresを定義します.
struct Squares
           count::Int
       end

次に、彼のiterateメソッドを定義し、明示的に応募を指定します.
Base.iterate(S::Squares, state=1) = state > S.count ? nothing : (state*state, state+1)

stateがcountより小さい場合は、その平方値を計算し、+1にします.そうしない場合はnothingを返します.
定義したらforループで次のように反復します.
julia> for i in Squares(5)
       println(i)
       end
1
4
9
16
25

3、反復に関するその他の方法
iterableが実装されると、in(要素が集合中であるかどうかを確認)、mean(平均数を求める)、std(分散を求める)、後の2つの関数がStatisticsパッケージに含まれるなど、他の関連関数も使用できます.
julia> 25 in Squares(10)
true

julia> using Statistics

julia> mean(Squares(3))
4.666666666666667

julia> std(Squares(100))
3024.355854282583

4、他の反復集合を実現する方法
Squaresの反復集合に関する他の方法を実装することもできます:eltype(集合要素タイプを返す)、length(集合要素の個数を返す)、
 julia> Base.eltype(::Type{Squares}) = Int # Note that this is defined for the type

julia> Base.length(S::Squares) = S.count

julia> sum(Squares(100))
338350

デフォルトのsumメソッドは、すべての要素の和を循環反復によって計算します.sumメソッドをより効率的に再実現し、式を使用して直接和を求めることができます.
julia> Base.sum(S::Squares) = (n = S.count; return n*(n+1)*(2n+1)÷6)

julia> sum(Squares(1803))
1955361914

5.逆反復
逆反復を実現するには、Iteratorsを実現する必要がある.Reverse{T}のiterateメソッド,Tはタイプを指し,ここではIteratorsを実現する.Reverse{Squares},collectは集合要素を収集し,for反復も可能である.
julia> Base.iterate(rS::Iterators.Reverse{Squares}, state=rS.itr.count) = state < 1 ? nothing : (state*state, state-1)

julia> collect(Iterators.reverse(Squares(4)))
4-element Array{Int64,1}:
 16
  9
  4
  1
  
julia> for i in Iterators.reverse(Squares(5))
       println(i)
       end
25
16
9
4
1