জুলিয়ার ক্ষেত্র এবং বৈশিষ্ট্যের মধ্যে পার্থক্য কী?


23

জুলিয়ার সেটার ফাংশন setproperty!এবং setfield!গেটর ফাংশন রয়েছে 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এবং cgetfieldক্ষেত্রের সাথে আবদ্ধ অবজেক্টটিকে ফেরত দেওয়ার জন্য একটি কল :

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

সুতরাং আপনি গেটফিল্ড ওভারলোড করতে পারবেন না?
আলফায়েজখান

3
না, getfieldএকটি বিশেষ (অন্তর্নির্মিত) ফাংশন। এটি ওভারলোড করার চেষ্টা করে ত্রুটি ঘটবে cannot add methods to a builtin function
ক্রিস্টোফার কার্লসন

কোথাও উত্তরে সেই তথ্য যুক্ত করবেন?
স্টেফানকার্পিনস্কি

2
উত্তর ইতিমধ্যে পরিষ্কারভাবে বলেছে "(এটি ওভারলোড করা সম্ভব নয় getfield)" সুতরাং, এক অর্থে, এটি ইতিমধ্যে রয়েছে।
ক্রিস্টোফার কার্লসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.