ジュリアのフィールドとプロパティの違いは何ですか?


23

Juliaには、setter関数setproperty!setfield!getter関数がgetpropertyありgetfield、構造体を操作します。ジュリアのプロパティとフィールドの違いは何ですか?

たとえば、次の例は同じことを示しているようです。

julia> mutable struct S
           a
       end

julia> s = S(2)
S(2)

julia> getfield(s, :a)
2

julia> getproperty(s, :a)
2

julia> setfield!(s, :a, 3)
3

julia> s
S(3)

julia> setproperty!(s, :a, 4)
4

julia> s
S(4)

回答:


27

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

getfieldをオーバーロードできないのですか?
Alfaizkhan、

3
いいえ、getfield特別な(組み込み)関数です。オーバーロードしようとすると、エラーが発生しますcannot add methods to a builtin function
Kristoffer Carlsson、

多分どこかに答えにその情報を追加しますか?
StefanKarpinski

2
答えはすでに「(オーバーロードすることは不可能getfield)」と明示的に言っているので、ある意味で、それはすでにそこにあります。
Kristoffer Carlsson、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.