fields
basitçe bir yapının "bileşenleridir". Yapı
struct A
b
c::Int
end
alanları vardır b
ve c
. getfield
Alana bağlı nesneyi döndürmek için bir çağrı :
julia> a = A("foo", 3)
A("foo", 3)
julia> getfield(a, :b)
"foo"
Julia'nın ilk versiyonlarında, sözdizimi a.b
"indirgemek", yani yazmakla aynı anlama gelirdi getfield(a, :b)
. Şimdi ne değişti olmasıdır a.b
için düşürür getproperty(a, :b)
varsayılan yedek kullanımıyla
getproperty(a::Type, v::Symbol) = getfield(a, v)
Yani varsayılan olarak hiçbir şey değişmedi. Bununla birlikte, yapı yazarları nokta sözdizimine ekstra işlevsellik sağlamak getproperty
için aşırı yüklenebilir ( aşırı yüklenmek mümkün değildir 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"
Böylece nokta sözdizimine ekstra işlevsellik ekleyebiliriz (istersek dinamik olarak). Bunun yararlı olduğu somut bir örnek olarak, eskiden yazmak zorunda kaldığınız PyCall.jl paketi için pyobject[:field]
yazabilirsiniz.pyobject.field.
Arasındaki fark setfield!
ve setproperty!
arasındaki fark benzer olan getfield
ve getproperty
yukarıda açıklandığı.
Ek olarak, Base.propertynames
REPL'deki özelliklerin sekme tamamlanmasını sağlamak için işleve bağlanmak da mümkündür . Varsayılan olarak, yalnızca alan adları gösterilir:
julia> a.<TAB><TAB>
b c
Ancak aşırı propertynames
yükleyerek, ekstra özelliği de gösterebiliriz q
:
julia> Base.propertynames(::A) = (:b, :c, :q)
julia> a.<TAB><TAB>
b c q