কী class << self
না রুবি ?
কী class << self
না রুবি ?
উত্তর:
প্রথমে class << foo
সিনট্যাক্সটি foo
সিঙ্গলটন ক্লাস (ইজেনক্লাস) খোলে । এটি আপনাকে সেই নির্দিষ্ট অবজেক্টে ডাকা পদ্ধতিগুলির আচরণ বিশেষায়িত করতে দেয়।
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
এখন, প্রশ্নের উত্তর দেওয়ার জন্য: এর সিঙ্গলটন শ্রেণি class << self
খোলে self
, যাতে বর্তমান self
অবজেক্টের জন্য পদ্ধতিগুলি পুনরায় সংজ্ঞায়িত করা যায় (যা কোনও শ্রেণি বা মডিউল বডির ভিতরে শ্রেণি বা মডিউল নিজেই হয় )। সাধারণত, এটি শ্রেণি / মডিউল ("স্ট্যাটিক") পদ্ধতিগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়:
class String
class << self
def value_of obj
obj.to_s
end
end
end
String.value_of 42 # => "42"
এটি শর্টহ্যান্ড হিসাবেও লেখা যেতে পারে:
class String
def self.value_of obj
obj.to_s
end
end
বা আরও ছোট:
def String.value_of obj
obj.to_s
end
কোনও ফাংশন সংজ্ঞায়নের অভ্যন্তরে যখন ফাংশনটি self
ডাকা হচ্ছে তাকে বোঝায়। এই ক্ষেত্রে, class << self
that বস্তুর জন্য সিঙ্গলটন ক্লাস খোলে; এর একটি ব্যবহার একটি দরিদ্র ব্যক্তির রাষ্ট্রীয় মেশিনটি প্রয়োগ করা:
class StateMachineExample
def process obj
process_hook obj
end
private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end
def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end
# Set up initial state
alias process_hook process_state_1
end
সুতরাং, উপরের উদাহরণে, প্রতিটি নিদর্শনের StateMachineExample
করেছে process_hook
ওরফে অন্য process_state_1
কিন্তু নোট কিভাবে আধুনিক, এটা পুনরায় সংজ্ঞায়িত করতে process_hook
(জন্য self
শুধুমাত্র, অন্যান্য প্রভাবিত না StateMachineExample
দৃষ্টান্ত) এর process_state_2
। সুতরাং, প্রতিবার একজন কলকারী process
পদ্ধতিতে কল করে (যাকে পুনরায় সংজ্ঞাযোগ্য বলে ডাকে process_hook
), আচরণটি তার অবস্থার উপর নির্ভর করে পরিবর্তিত হয়।
class << self
শ্রেণি / মডিউল পদ্ধতি তৈরি করতে এটি প্রকৃতই বেশি ব্যবহৃত হয় । আমি সম্ভবত ব্যবহারের প্রসারিত করব class << self
, কারণ এটি অনেক বেশি বুদ্ধিমান ব্যবহার।
a
এর singleton_class
পর থেকে এটি উল্লেখ করা সত্যিই বিভ্রান্তিকরa
গুলি শ্রেণী (পরিবর্তন করার পর' inspect
) একটি অনন্য বৈচিত্র হয় String
বর্গ। যদি এটি সিঙ্গলটন String
শ্রেণি পরিবর্তন করে থাকে তবে এটি অন্যান্য সমস্ত String
দৃষ্টান্তগুলিকে প্রভাবিত করবে । কি weirder এখনও যে যদি আপনি পরে পুনরায় খোলা হয় String
পুনরায় সংজ্ঞায়িত inspect
তারপর a
এখনও নতুন পরিবর্তনের কুড়ান হবে।
class << self
অর্থself
ব্লকের স্কোপের মধ্যে থাকা সিঙ্গলটন শ্রেণির সমান মানের চেয়ে বেশি কিছু ?
আমি একটি সুপার সহজ ব্যাখ্যা পাওয়া class << self
, Eigenclass
এবং পদ্ধতি বিভিন্ন ধরনের।
রুবিতে, শ্রেণিতে প্রয়োগ করা যেতে পারে এমন তিন ধরণের পদ্ধতি রয়েছে:
ইনস্ট্যান্স পদ্ধতি এবং শ্রেণিক পদ্ধতিগুলি অন্যান্য প্রোগ্রামিং ভাষায় তাদের বেনামে প্রায় অনুরূপ।
class Foo
def an_instance_method
puts "I am an instance method"
end
def self.a_class_method
puts "I am a class method"
end
end
foo = Foo.new
def foo.a_singleton_method
puts "I am a singletone method"
end
অ্যাক্সেসের আরেকটি উপায় Eigenclass
(যার মধ্যে সিঙ্গেলটন পদ্ধতি রয়েছে) নিম্নলিখিত সিনট্যাক্স ( class <<
) সহ:
foo = Foo.new
class << foo
def a_singleton_method
puts "I am a singleton method"
end
end
এখন আপনি একটি সিঙ্গলটন পদ্ধতিটি নির্ধারণ করতে পারেন self
যার জন্য Foo
এই প্রসঙ্গে ক্লাস নিজেই:
class Foo
class << self
def a_singleton_and_class_method
puts "I am a singleton method for self and a class method for Foo"
end
end
end
foo.singleton_class.instance_methods(false)
চেক করতে ব্যবহার করতে পারেন ।
সাধারণত, উদাহরণ পদ্ধতি হ'ল বৈশ্বিক পদ্ধতি। এর অর্থ তারা যে শ্রেণীর উপর তাদের সংজ্ঞায়িত হয়েছিল সে সব ক্ষেত্রেই তারা উপলব্ধ। বিপরীতে, একক বস্তুতে একটি সিঙ্গলটন পদ্ধতি প্রয়োগ করা হয়।
রুবি ক্লাসে পদ্ধতিগুলি সঞ্চয় করে এবং সমস্ত পদ্ধতি অবশ্যই একটি শ্রেণীর সাথে যুক্ত থাকতে পারে। যে বস্তুর উপরে সিঙ্গলটন পদ্ধতিটি সংজ্ঞায়িত করা হয়েছে তা কোনও শ্রেণি নয় (এটি কোনও শ্রেণীর উদাহরণ)। যদি কেবল ক্লাসগুলি পদ্ধতি সংরক্ষণ করতে পারে তবে কোনও বস্তু কীভাবে একটি একক পদ্ধতিতে সঞ্চয় করতে পারে? যখন একটি সিঙ্গলটন পদ্ধতি তৈরি করা হয়, রুবি স্বয়ংক্রিয়ভাবে সেই পদ্ধতিটি সংরক্ষণ করার জন্য একটি বেনাম শ্রেণি তৈরি করে। এই বেনামে ক্লাসগুলিকে মেটাক্লাস বলা হয়, এটি সিঙ্গলটন ক্লাস বা আইজেনচ্লাস হিসাবেও পরিচিত। সিঙ্গেলটন পদ্ধতিটি মেটাক্লাসের সাথে সম্পর্কিত যা ঘুরেফিরে, সেই বস্তুর সাথে সম্পর্কিত যা সিঙ্গলটন পদ্ধতিটি সংজ্ঞায়িত হয়েছিল।
যদি একক বস্তুর মধ্যে একাধিক একক পদ্ধতিগুলি সংজ্ঞায়িত করা হয় তবে সেগুলি একই মেটাক্লাসে সঞ্চিত থাকে।
class Zen
end
z1 = Zen.new
z2 = Zen.new
class << z1
def say_hello
puts "Hello!"
end
end
z1.say_hello # Output: Hello!
z2.say_hello # Output: NoMethodError: undefined method `say_hello'…
উপরের উদাহরণে, ক্লাস << z1 বর্তমান স্ব পরিবর্তন করে z1 অবজেক্টের মেটাক্লাসের দিকে নির্দেশ করে; তারপরে, এটি মেটাক্লাসের মধ্যে say_hello পদ্ধতিটি সংজ্ঞায়িত করে।
ক্লাসগুলিও বস্তু (ক্লাস নামে অন্তর্নির্মিত শ্রেণীর উদাহরণ)) ক্লাসের পদ্ধতিগুলি কোনও শ্রেণীর অবজেক্টের সাথে সম্পর্কিত সিঙ্গলটন পদ্ধতি ছাড়া আর কিছুই নয়।
class Zabuton
class << self
def stuff
puts "Stuffing zabuton…"
end
end
end
সমস্ত বস্তুর মেটাক্লাস থাকতে পারে। তার মানে ক্লাসেও মেটাক্লাস থাকতে পারে। উপরের উদাহরণে, ক্লাস << স্ব-স্ব পরিবর্তন করে তাই এটি জাবুতন শ্রেণির মেটাাক্লাসের দিকে নির্দেশ করে। যখন কোনও পদ্ধতি সুস্পষ্ট গ্রহীতা ব্যতীত সংজ্ঞায়িত করা হয় (শ্রেণি / অবজেক্ট যার উপর পদ্ধতিটি সংজ্ঞায়িত করা হবে), তখন এটি স্পষ্টভাবে বর্তমান সুযোগের মধ্যেই সংজ্ঞায়িত করা হয়, এটি হ'ল বর্তমান মান। অতএব, স্টাফ পদ্ধতিটি জাবুটন বর্গের মেটাক্লাসের মধ্যে সংজ্ঞায়িত করা হয়েছে। উপরের উদাহরণটি একটি শ্রেণিবদ্ধ পদ্ধতি সংজ্ঞায়িত করার অন্য একটি উপায়। আইএমএইচও, ক্লাসের পদ্ধতিগুলি সংজ্ঞায়িত করার জন্য ডিএফ সেল্ফ.মি_নেউ_ক্লাস_মোথারিক সিনট্যাক্স ব্যবহার করা আরও ভাল, কারণ কোডটি বুঝতে সহজ হয়। উপরের উদাহরণটি অন্তর্ভুক্ত করা হয়েছিল সুতরাং আমরা যখন ক্লাস << স্ব স্ব বাক্যবিন্যাসে এসে পড়ি তখন কী ঘটছে তা আমরা বুঝতে পারি।
রুবি ক্লাস সম্পর্কে অতিরিক্ত তথ্য এই পোস্টে পাওয়া যাবে ।
class Hi
self #=> Hi
class << self #same as 'class << Hi'
self #=> #<Class:Hi>
self == Hi.singleton_class #=> true
end
end
[এটি self == thing.singleton_class
এর ব্লকের প্রসঙ্গে তৈরি করে] ।
hi = String.new
def hi.a
end
hi.class.instance_methods.include? :a #=> false
hi.singleton_class.instance_methods.include? :a #=> true
hi
অবজেক্টটি তার #methods
থেকে #singleton_class.instance_methods
এবং তার থেকে তার উত্তরাধিকার সূত্রে প্রাপ্ত #class.instance_methods
।
এখানে আমরা hi
এর সিঙ্গলটন ক্লাস উদাহরণ পদ্ধতিটি দিয়েছি :a
। এটি পরিবর্তে << হাই ক্লাস দিয়ে করা যেতে পারে ।
hi
'গুলি #singleton_class
হয়েছে সব উদাহরণস্বরূপ পদ্ধতি hi
' র #class
আছে, এবং সম্ভবত আরো কিছু (:a
এখানে)।
[জিনিস উদাহরণস্বরূপ পদ্ধতি #class
এবং #singleton_class
জিনিসটিতে সরাসরি প্রয়োগ করা যেতে পারে। রুবি যখন জিনিসটি দেখে,
যাইহোক - তারা অবজেক্টের সিঙ্গলটন শ্রেণি == মেটাক্লাস == আইজেনক্লাস বলে call ।
А সিঙ্গলটন পদ্ধতি এমন একটি পদ্ধতি যা কেবলমাত্র একক বস্তুর জন্য সংজ্ঞায়িত হয়।
উদাহরণ:
class SomeClass
class << self
def test
end
end
end
test_obj = SomeClass.new
def test_obj.test_2
end
class << test_obj
def test_3
end
end
puts "Singleton's methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton's methods of test_obj"
puts test_obj.singleton_methods
সিঙ্গলটনের সামার ক্লাসের পদ্ধতিগুলি
পরীক্ষা
একক এর পরীক্ষার পদ্ধতি_বজ
test_2
test_3
বাস্তবে আপনি যদি আপনার রুবি প্রকল্পগুলির জন্য কোনও সি এক্সটেনশান লিখেন তবে মডিউল পদ্ধতিটি সংজ্ঞায়নের জন্য কেবলমাত্র একটি উপায় আছে।
rb_define_singleton_method
আমি জানি এই স্ব-ব্যবসাটি কেবলমাত্র সমস্ত প্রকারের প্রশ্নই খুলে দেয় যাতে আপনি প্রতিটি অংশ অনুসন্ধান করে আরও ভাল করতে পারেন।
প্রথমে অবজেক্টস।
foo = Object.new
আমি কি Foo এর জন্য একটি পদ্ধতি তৈরি করতে পারি?
অবশ্যই
def foo.hello
'hello'
end
আমি এটি দিয়ে কি করব?
foo.hello
==>"hello"
ঠিক অন্য একটি জিনিস।
foo.methods
আপনি সমস্ত নতুন অবজেক্টের পদ্ধতি এবং আপনার নতুনটি পান।
def foo.self
self
end
foo.self
শুধু foo অবজেক্ট।
আপনি ক্লাস এবং মডিউলের মতো অন্যান্য অবজেক্টগুলি থেকে ফু বানালে কী হয় তা দেখার চেষ্টা করুন। সমস্ত উত্তরগুলির উদাহরণগুলি খেললে দুর্দান্ত তবে আপনাকে কোডটি কীভাবে লেখা হচ্ছে তাতে কী চলছে তা বুঝতে আপনাকে বিভিন্ন ধারণা বা ধারণা নিয়ে কাজ করতে হবে। সুতরাং এখন আপনার কাছে দেখার জন্য প্রচুর শর্তাদি রয়েছে।
সিঙ্গেলটন, ক্লাস, মডিউল, স্ব, অবজেক্ট এবং আইজেনক্লাস নিয়ে আসা হয়েছিল কিন্তু রুবি সেভাবে অবজেক্ট মডেলের নাম রাখেনি। এটি আরও মেটাক্লাসের মতো। রিচার্ড বা __ কেন আপনাকে এখানে ধারণাটি দেখায়। http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html এবং যদি আপনাকে চলে যায় তবে অনুসন্ধানে রুবি অবজেক্ট মডেলটি অনুসন্ধান করার চেষ্টা করুন। ইউটিউবে আমি যে দুটি ভিডিও জানি তা হ'ল ডেভ থমাস এবং পিটার কুপার। তারা সেই ধারণাটিও ব্যাখ্যা করার চেষ্টা করে। ডেভকে এটি পেতে দীর্ঘ সময় নিয়েছে তাই চিন্তা করবেন না। আমি এখনও এটি নিয়ে কাজ করছি। কেন আমি এখানে থাকব? আপনার প্রশ্নের জন্য ধন্যবাদ। মানক পাঠাগারটিও একবার দেখুন। এটিতে এফওয়াইআইয়ের মতো একটি সিঙ্গলটন মডিউল রয়েছে।
এটি বেশ ভাল। https://www.youtube.com/watch?v=i4uiyWA8eFk