fields
単に構造体の「コンポーネント」です。構造体
struct A
b
c::Int
end
フィールドb
とがありますc
。を呼び出すとgetfield
、フィールドにバインドされているオブジェクトが返されます。
julia> a = A("foo", 3)
A("foo", 3)
julia> getfield(a, :b)
"foo"
Juliaの初期のバージョンでは、構文a.b
は "下位"、つまりと同じgetfield(a, :b)
でした。現在変更されているのは、デフォルトのフォールバックで a.b
低下するgetproperty(a, :b)
ことです
getproperty(a::Type, v::Symbol) = getfield(a, v)
したがって、デフォルトでは何も変更されていません。ただし、構造体の作成者は、ドット構文に追加機能を提供するためgetproperty
にオーバーロードできます(オーバーロードすることはできませんgetfield
)。
julia> function Base.getproperty(a::A, v::Symbol)
if v == :c
return getfield(a, :c) * 2
elseif v == :q
return "q"
else
return getfield(a, v)
end
end
julia> a.q
"q"
julia> getfield(a, :q)
ERROR: type A has no field q
julia> a.c
6
julia> getfield(a, :c)
3
julia> a.b
"foo"
したがって、ドット構文に機能を追加できます(必要に応じて動的に)。これが役立つ具体的な例としては、pyobject[:field]
以前は書き込む必要があったが、今はそれを実装して次のように実装できるパッケージPyCall.jlの場合があります。pyobject.field.
差setfield!
とsetproperty!
の間の差に類似しているgetfield
とはgetproperty
、上記説明しました。
さらにBase.propertynames
、REPLでプロパティのタブ補完を提供するために関数にフックすることが可能です。デフォルトでは、フィールド名のみが表示されます。
julia> a.<TAB><TAB>
b c
ただし、オーバーロードpropertynames
することで、追加のプロパティも表示することができますq
。
julia> Base.propertynames(::A) = (:b, :c, :q)
julia> a.<TAB><TAB>
b c q