📐

Julia の Array の struct をあたかもArrayのように使う方法

2023/04/17に公開2

課題

なんかの

struct A{T}
	a::T
end

があって、 複数の A を扱いたいときに

  • struct のリストを使う
  • リストを内包した別のstructを作る
    かの選択を迫られる。

どちらを使うかはまぁ好みとして(パフォーマンスに影響出るからどっちが優位かすでに決まっているかもしれないけど)
問題は、後者の場合

struct B
	list :: Array{A}
end
something = B(hogehoge)

としてlistにアクセスするときにいちいち

something.list[3:end]

などとアクセスしなければならなくて面倒

解決策

対象のstructに対して下記のように getindex 関数を定義してやれば良い

getindex(L::B, inds...) = getindex(L.list, inds...)

これでコンストラクタに直接スライス記法でアクセスできる something[2:end]

最後に&参考

リスト + 追加情報をセットにしたstructを作るときにアクセスが煩雑だと思いながら公式ソース[1]眺めてたら、意外とかんたん書けることに気づいてスッキリしたので記す

[1]https://github.com/JuliaLang/julia/blob/17cfb8e65ead377bf1b4598d8a9869144142c84e/base/array.jl#L902-L920

Discussion