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