ruby - ক্লাস<< রুবি মধ্যে স্ব idiom




metaclass eigenclass (4)

class << self কি class << self রুবি রুমে না?


কি শ্রেণী << জিনিস করে:

class Hi
  self #=> Hi
  class << self #same as 'class << Hi'
    self #=> #<Class:Hi>
    self == Hi.singleton_class #=> true
  end
end

[এটি ব্লক প্রসঙ্গে self == thing.singleton_class . self == thing.singleton_class তোলে ]

জিনিসটা কি? S.sleleton_class?

hi = String.new
def hi.a
end

hi.class.instance_methods.include? :a #=> false
hi.singleton_class.instance_methods.include? :a #=> true

hi অবজেক্ট তার #singleton_class.instance_methods #methods এবং তার #singleton_class.instance_methods #methods থেকে তার #singleton_class.instance_methods #methods উত্তরাধিকার #class.instance_methods
এখানে আমরা hi এর সিঙ্গল্ট ক্লাস ইনস্ট্যান্স পদ্ধতি প্রদান করেছি :a । এটি ক্লাস << হাই পরিবর্তে সম্পন্ন হতে পারে।
hi এর #singleton_class এর সব ইনস্ট্যান্স পদ্ধতি hi এর #class আছে, এবং সম্ভবত আরো কিছু ( :a এখানে :a )।

[উদাহরণের #class এবং #singleton_class এর উদাহরণ পদ্ধতি সরাসরি #singleton_class প্রয়োগ করা যেতে পারে। যখন রুবি জিনিসটি দেখায়। aa, এটি প্রথমে দেখায়: thing.singleton_class.instance_methods এ পদ্ধতি পদ্ধতি এবং তারপর thing.class.instance_methods]

যাইহোক - তারা বস্তুর একক্টন ক্লাস == মেটাক্লাস == ইগেনক্লাসকে কল করে


А সিঙ্গলটন পদ্ধতি একটি পদ্ধতি যা শুধুমাত্র একটি বস্তুর জন্য সংজ্ঞায়িত করা হয়।

উদাহরণ:

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

SomeClass এর Singleton এর পদ্ধতি

পরীক্ষা

Test_obj এর Singleton এর পদ্ধতি

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 বস্তু।

আপনি ক্লাস এবং মডিউল মত অন্যান্য বস্তুর থেকে foo করতে হলে কি হবে তা দেখতে চেষ্টা করুন। সমস্ত উত্তরের উদাহরণগুলি সাথে খেলতে সুন্দর লাগছে কিন্তু কোডটি কীভাবে লেখা হয়েছে তা বোঝার জন্য আপনাকে বিভিন্ন ধারনা বা ধারণার সাথে কাজ করতে হবে। সুতরাং এখন আপনি দেখার জন্য পদ প্রচুর আছে।

সিঙ্গলটন, ক্লাস, মডিউল, স্ব, অবজেক্ট, এবং ইগেনক্লাস উত্থাপিত হয়েছিল তবে রুবি এইভাবে অবজেক্ট মডেলগুলিকে নাম করে না। এটা Metaclass মত আরো। রিচার্ড বা __why আপনি এখানে ধারণা দেখায়। viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html এবং যদি আপনি দূরে আঘাত করে তবে সন্ধানে রুবি অবজেক্ট মডেলটি দেখতে চেষ্টা করুন। ইউটিউবে যে দুটি ভিডিও আমি জানি তা হলো ডেভ থমাস এবং পিটার কুপার। তারা খুব যে ধারণা ব্যাখ্যা করার চেষ্টা করুন। এটা ডেভকে অনেক সময় লাগতে লাগলো তাই চিন্তা করো না। আমি এখনও এটা খুব কাজ করছি। কেন আমি এখানে থাকব? আপনার প্রশ্নের জন্য ধন্যবাদ। এছাড়াও স্ট্যান্ডার্ড লাইব্রেরি একটি চেহারা নিতে। এটি একটি FYI হিসাবে একটি Singleton মডিউল আছে।

এই বেশ ভাল। https://www.youtube.com/watch?v=i4uiyWA8eFk


প্রথম, class << foo সিনট্যাক্স foo এর সিঙ্গল্ট ক্লাস (eigenclass) খোলে। এটি আপনাকে সেই নির্দিষ্ট বস্তুতে বলা পদ্ধতিগুলির আচরণ বিশেষজ্ঞ করতে সহায়তা করে।

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 সেই বস্তুর জন্য সিঙ্গলটনের ক্লাস খোলে; এর একটি ব্যবহার একটি দরিদ্র মানুষের রাষ্ট্র মেশিন বাস্তবায়ন করা হয়:

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 এর প্রত্যেকটি উদাহরণটি StateMachineExample এর সাথে StateMachineExample করেছে, তবে পরবর্তীতে এটি কীভাবে StateMachineExample ( self জন্য, অন্যান্য StateMachineExample উদাহরণ StateMachineExample প্রভাবিত করে না) StateMachineExample পুনরায় সংজ্ঞায়িত করতে পারে তা নোট করুন। সুতরাং, প্রতিটি সময় একজন কলার process পদ্ধতি (যা পুনরায় সংজ্ঞাযোগ্য process_hook কল করে) কল করে, আচরণটি কোন অবস্থানে রয়েছে তার উপর নির্ভর করে পরিবর্তিত হয়।





singleton