ক্লাস ভেরিয়েবল এবং ক্লাস উদাহরণ ভেরিয়েবলের মধ্যে পার্থক্য সম্পর্কে কেউ কি আমাকে বলতে পারবেন?
উত্তর:
ক্লাস ভেরিয়েবল ( @@
) শ্রেণি এবং এর সমস্ত বংশধরের মধ্যে ভাগ করা হয়। শ্রেণীর উদাহরণ পরিবর্তনশীল ( @
) শ্রেণীর বংশধরদের দ্বারা ভাগ করা হয় না।
ক্লাস ভেরিয়েবল ( @@
)
আসুন একটি ক্লাস ভেরিয়েবল সহ একটি ক্লাস ফু রাখি @@i
এবং পড়তে এবং লেখার জন্য অ্যাক্সেসরগুলি পাই @@i
:
class Foo
@@i = 1
def self.i
@@i
end
def self.i=(value)
@@i = value
end
end
এবং প্রাপ্ত একটি বর্গ:
class Bar < Foo
end
আমরা দেখতে পাই যে ফু এবং বারের জন্য একই মূল্য রয়েছে @@i
:
p Foo.i # => 1
p Bar.i # => 1
এবং @@i
একটিতে পরিবর্তন করা উভয় ক্ষেত্রেই এটি পরিবর্তন করে:
Bar.i = 2
p Foo.i # => 2
p Bar.i # => 2
শ্রেণীর উদাহরণ পরিবর্তনশীল ( @
)
আসুন একটি সাধারণ শ্রেণি তৈরি করি যা ক্লাস উদাহরণের সাথে পরিবর্তনশীল @i
এবং পড়া এবং লেখার জন্য অ্যাক্সেসর রয়েছে @i
:
class Foo
@i = 1
def self.i
@i
end
def self.i=(value)
@i = value
end
end
এবং প্রাপ্ত একটি বর্গ:
class Bar < Foo
end
আমরা দেখতে পাই যে বারের জন্য অ্যাক্সেসরদের উত্তরাধিকারসূত্রে পাওয়া @i
গেলেও এটি নিজের উত্তরাধিকার সূত্রে আসে না @i
:
p Foo.i # => 1
p Bar.i # => nil
@i
ফু এর উপর প্রভাব না ফেলেই আমরা বার সেট করতে পারি @i
:
Bar.i = 2
p Foo.i # => 1
p Bar.i # => 2
প্রথমে আপনাকে অবশ্যই বুঝতে হবে যে ক্লাসগুলিও উদাহরণ - শ্রেণীর উদাহরণ Class
।
একবার আপনি এটি বুঝতে পারলে, আপনি বুঝতে পারবেন যে কোনও শ্রেণীর সাথে নিয়মিত (পড়ুন: নন-শ্রেণি) অবজেক্ট যেমন পারে তেমনভাবে উদাহরণের সাথে ভেরিয়েবল যুক্ত থাকতে পারে।
Hello = Class.new
# setting an instance variable on the Hello class
Hello.instance_variable_set(:@var, "good morning!")
# getting an instance variable on the Hello class
Hello.instance_variable_get(:@var) #=> "good morning!"
মনে রাখবেন যে, উপর একটি দৃষ্টান্ত পরিবর্তনশীল Hello
একটি অন সম্পূর্ণরূপে একটি দৃষ্টান্ত পরিবর্তনশীল থেকে সম্পর্কহীন এবং স্বতন্ত্র উদাহরণস্বরূপ এরHello
hello = Hello.new
# setting an instance variable on an instance of Hello
hello.instance_variable_set(:@var, :"bad evening!")
# getting an instance variable on an instance of Hello
hello.instance_variable_get(:@var) #=> "bad evening!")
# see that it's distinct from @var on Hello
Hello.instance_variable_get(:@var) #=> "good morning!"
একটি বর্গ পরিবর্তনশীল অন্যদিকে, দুই উপরে সমন্বয় এক ধরনের যেমন অ্যাক্সেসযোগ্য Hello
, নিজেই এবং তার দৃষ্টান্ত হিসাবে ভাল এর উপশ্রেণী হিসাবে Hello
এবং তাদের দৃষ্টান্ত:
HelloChild = Class.new(Hello)
Hello.class_variable_set(:@@class_var, "strange day!")
hello = Hello.new
hello_child = HelloChild.new
Hello.class_variable_get(:@@class_var) #=> "strange day!"
HelloChild.class_variable_get(:@@class_var) #=> "strange day!"
hello.singleton_class.class_variable_get(:@@class_var) #=> "strange day!"
hello_child.singleton_class.class_variable_get(:@@class_Var) #=> "strange day!"
class variables
উপরের অদ্ভুত আচরণের কারণে অনেকে এড়াতে বলে এবং class instance variables
পরিবর্তে এর ব্যবহারের পরামর্শ দেয় ।
এছাড়াও আমি যোগ করতে চাই আপনি ক্লাসের যে @@
কোনও উদাহরণ থেকে ক্লাস ভেরিয়েবল ( ) এ অ্যাক্সেস পেতে পারেন
class Foo
def set_name
@@name = 'Nik'
end
def get_name
@@name
end
end
a = Foo.new
a.set_name
p a.get_name # => Nik
b = Foo.new
p b.get_name # => Nik
কিন্তু আপনি ক্লাস উদাহরণ চলক ( @
) এর জন্য একই করতে পারবেন না
class Foo
def set_name
@name = 'Nik'
end
def get_name
@name
end
end
a = Foo.new
a.set_name
p a.get_name # => Nik
b = Foo.new
p b.get_name # => nil
Foo.i
তবে আপনি এই ক্লাসের প্রতিটি উদাহরণের জন্য কীভাবে একই কাজ করতে পারেন Foo.new.i
?
#class
। আমি ব্যক্তিগতভাবে মনে করি যে #class
কোনও কিছুর জন্য ডাকা self
হলেও ব্যবহারযোগ্য তবে কোডটি গন্ধযুক্ত। এমনকি আপনি এক পা এগিয়ে যান এবং উদাহরণ হিসেবে বলা যায় accessors বাস্তবায়ন করতে পারে i
এবং i=
তাদের যে প্রতিনিধি #class
সমতুল, যে ক্ষেত্রে আপনি কি করতে পারেন Foo.new.i
। আমি এটি করার প্রস্তাব দিচ্ছি না কারণ এটি একটি বিভ্রান্তিকর ইন্টারফেস তৈরি করে, যা আপনি কোনও অবজেক্ট সদস্যকে সংশোধন করছেন।