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"
সুতরাং আমরা ডট সিনট্যাক্সে অতিরিক্ত কার্যকারিতা যুক্ত করতে পারি (আমরা চাইলে গতিশীলভাবে)। এটি একটি কার্যকর উদাহরণ হিসাবে পাইক্যাল প্যাকেজ প্যাকেজটির জন্য এটি দরকারী যেখানে pyobject[:field]
এটি লিখতে হবে যখন আপনি এটি লিখতে সক্ষম হবেন যেমন এটি প্রয়োগ করা সম্ভব হয়pyobject.field.
মধ্যে পার্থক্য setfield!
এবং setproperty!
এর মধ্যে পার্থক্য অনুরূপ getfield
এবং getproperty
, উপরোক্ত ব্যাখ্যা।
এছাড়াও, Base.propertynames
আরএপিএলে বৈশিষ্ট্যগুলির ট্যাব সমাপ্তির জন্য ফাংশনটিতে আটকানো সম্ভব। ডিফল্টরূপে কেবলমাত্র ক্ষেত্রের নামগুলি প্রদর্শিত হবে:
julia> a.<TAB><TAB>
b c
তবে অতিরিক্ত লোডের মাধ্যমে propertynames
আমরা এটিকে অতিরিক্ত সম্পত্তিও প্রদর্শন করতে পারি q
:
julia> Base.propertynames(::A) = (:b, :c, :q)
julia> a.<TAB><TAB>
b c q