fields
बस एक संरचना के "घटक" हैं। संरचना
struct A
b
c::Int
end
खेतों b
और है c
। getfield
फ़ील्ड के लिए बाध्य ऑब्जेक्ट को वापस करने के लिए एक कॉल :
julia> a = A("foo", 3)
A("foo", 3)
julia> getfield(a, :b)
"foo"
जूलिया के शुरुआती संस्करणों में, वाक्यविन्यास का 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"
तो हम डॉट सिंटैक्स में अतिरिक्त कार्यक्षमता जोड़ सकते हैं (गतिशील रूप से यदि हम चाहते हैं)। एक ठोस उदाहरण के रूप में, जहाँ यह उपयोगी है, PyCall.jl पैकेज के लिए है, जहाँ आपको लिखना पड़ता था pyobject[:field]
जबकि अब इसे लागू करना संभव है, ताकि आप लिख सकें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