ক্লাস << রুবীতে স্ব-প্রতিমা


873

কী class << selfনা রুবি ?


35
ইহুদা কাটজ রচিত এই বিষয় সম্পর্কে একটি খুব সুন্দর নিবন্ধ রয়েছে: ইয়াহুডাকটজ. com/ 2009
আন্দ্রেই

3
এখানে আরও একটি দুর্দান্ত চমৎকার নিবন্ধ: ইন্টিগ্রালালিস্ট.কম.পোস্ট
পোস্টগুলি / এজেনগ্লাস এইচটিটিএমএল

2
আমি এটি একটি মডিউল ভিতরে দেখতে পাচ্ছি, এটি কি আলাদা করে তোলে? github.com/ruby/rake/blob/master/lib/rake/rake_module.rb
উইলিয়াম এন্টারিকেন

@ ফুলডিসেন্ট এটি কোনও তাত্পর্যপূর্ণ করে না কারণ রুবির সবকিছু মডিউল এবং ক্লাস সহ একটি বস্তু।
অ্যারন

1
দেখুন github.com/defunkt/metaid/blob/master/metaid.rb এটি হবে "স্পষ্টত Metaclasses দেখতে দেখতে" সঙ্গে যায় viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html
ডগলাস জি অ্যালেন

উত্তর:


912

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

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), আচরণটি তার অবস্থার উপর নির্ভর করে পরিবর্তিত হয়।


22
@ জার্গ: সম্পাদনার জন্য +1 (আমার ইচ্ছা এসও সম্পাদনাগুলিকে উন্নত করার ক্ষমতা সরবরাহ করে; ওহ ভাল)। class << selfশ্রেণি / মডিউল পদ্ধতি তৈরি করতে এটি প্রকৃতই বেশি ব্যবহৃত হয় । আমি সম্ভবত ব্যবহারের প্রসারিত করব class << self, কারণ এটি অনেক বেশি বুদ্ধিমান ব্যবহার।
ক্রিস জেস্টার-ইয়ং

4
gsub! ("eigenclass", "সিঙ্গেলটন ক্লাস"), আসন্ন পদ্ধতিটি redmine.ruby-lang.org/repositories/revision/1?rev=27022
মার্ক-আন্দ্রে লাফোর্টুন

4
aএর singleton_classপর থেকে এটি উল্লেখ করা সত্যিই বিভ্রান্তিকরa গুলি শ্রেণী (পরিবর্তন করার পর' inspect) একটি অনন্য বৈচিত্র হয় Stringবর্গ। যদি এটি সিঙ্গলটন Stringশ্রেণি পরিবর্তন করে থাকে তবে এটি অন্যান্য সমস্ত Stringদৃষ্টান্তগুলিকে প্রভাবিত করবে । কি weirder এখনও যে যদি আপনি পরে পুনরায় খোলা হয় Stringপুনরায় সংজ্ঞায়িত inspectতারপর aএখনও নতুন পরিবর্তনের কুড়ান হবে।
ওল্ড প্রো

1
@ ওল্ডপ্রো আমি এখনও আইজেনক্লাস নামটি পছন্দ করি, যেমনটি (আমার বিশ্বাস) ম্যাটজও করেন। তবে, সবাইকে খুশি করতে পারি না, আমার ধারণা।
ক্রিস জেস্টার-ইয়াং

5
আমি অভিব্যক্তিটি খুঁজে পাই, "একটি অবজেক্টের সিঙ্গলটন ক্লাস খোলে" - যা আমি এর আগে অনেকবার পড়েছি - অস্পষ্ট। আমার জানা মতে, রুবি ডক্সে কোথাও একটি ক্লাস সংজ্ঞায়িত "খোলার" নয়, যদিও এর অর্থ কী তা আমাদের সবার ধারণা রয়েছে। নেইclass << self অর্থself ব্লকের স্কোপের মধ্যে থাকা সিঙ্গলটন শ্রেণির সমান মানের চেয়ে বেশি কিছু ?
ক্যারি সোভোল্যান্ড 3:58

34

আমি একটি সুপার সহজ ব্যাখ্যা পাওয়া class << self, Eigenclassএবং পদ্ধতি বিভিন্ন ধরনের।

রুবিতে, শ্রেণিতে প্রয়োগ করা যেতে পারে এমন তিন ধরণের পদ্ধতি রয়েছে:

  1. তাত্ক্ষণিক পদ্ধতি
  2. একা পদ্ধতি
  3. ক্লাস পদ্ধতি

ইনস্ট্যান্স পদ্ধতি এবং শ্রেণিক পদ্ধতিগুলি অন্যান্য প্রোগ্রামিং ভাষায় তাদের বেনামে প্রায় অনুরূপ।

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

4
আসলে সিঙ্গলটন পদ্ধতি এবং ক্লাসের পদ্ধতিগুলি একই, উভয়ই সিঙ্গলটন ক্লাসে বিদ্যমান। আপনি foo.singleton_class.instance_methods(false)চেক করতে ব্যবহার করতে পারেন ।
দামন ইউয়ান

22

সাধারণত, উদাহরণ পদ্ধতি হ'ল বৈশ্বিক পদ্ধতি। এর অর্থ তারা যে শ্রেণীর উপর তাদের সংজ্ঞায়িত হয়েছিল সে সব ক্ষেত্রেই তারা উপলব্ধ। বিপরীতে, একক বস্তুতে একটি সিঙ্গলটন পদ্ধতি প্রয়োগ করা হয়।

রুবি ক্লাসে পদ্ধতিগুলি সঞ্চয় করে এবং সমস্ত পদ্ধতি অবশ্যই একটি শ্রেণীর সাথে যুক্ত থাকতে পারে। যে বস্তুর উপরে সিঙ্গলটন পদ্ধতিটি সংজ্ঞায়িত করা হয়েছে তা কোনও শ্রেণি নয় (এটি কোনও শ্রেণীর উদাহরণ)। যদি কেবল ক্লাসগুলি পদ্ধতি সংরক্ষণ করতে পারে তবে কোনও বস্তু কীভাবে একটি একক পদ্ধতিতে সঞ্চয় করতে পারে? যখন একটি সিঙ্গলটন পদ্ধতি তৈরি করা হয়, রুবি স্বয়ংক্রিয়ভাবে সেই পদ্ধতিটি সংরক্ষণ করার জন্য একটি বেনাম শ্রেণি তৈরি করে। এই বেনামে ক্লাসগুলিকে মেটাক্লাস বলা হয়, এটি সিঙ্গলটন ক্লাস বা আইজেনচ্লাস হিসাবেও পরিচিত। সিঙ্গেলটন পদ্ধতিটি মেটাক্লাসের সাথে সম্পর্কিত যা ঘুরেফিরে, সেই বস্তুর সাথে সম্পর্কিত যা সিঙ্গলটন পদ্ধতিটি সংজ্ঞায়িত হয়েছিল।

যদি একক বস্তুর মধ্যে একাধিক একক পদ্ধতিগুলি সংজ্ঞায়িত করা হয় তবে সেগুলি একই মেটাক্লাসে সঞ্চিত থাকে।

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

সমস্ত বস্তুর মেটাক্লাস থাকতে পারে। তার মানে ক্লাসেও মেটাক্লাস থাকতে পারে। উপরের উদাহরণে, ক্লাস << স্ব-স্ব পরিবর্তন করে তাই এটি জাবুতন শ্রেণির মেটাাক্লাসের দিকে নির্দেশ করে। যখন কোনও পদ্ধতি সুস্পষ্ট গ্রহীতা ব্যতীত সংজ্ঞায়িত করা হয় (শ্রেণি / অবজেক্ট যার উপর পদ্ধতিটি সংজ্ঞায়িত করা হবে), তখন এটি স্পষ্টভাবে বর্তমান সুযোগের মধ্যেই সংজ্ঞায়িত করা হয়, এটি হ'ল বর্তমান মান। অতএব, স্টাফ পদ্ধতিটি জাবুটন বর্গের মেটাক্লাসের মধ্যে সংজ্ঞায়িত করা হয়েছে। উপরের উদাহরণটি একটি শ্রেণিবদ্ধ পদ্ধতি সংজ্ঞায়িত করার অন্য একটি উপায়। আইএমএইচও, ক্লাসের পদ্ধতিগুলি সংজ্ঞায়িত করার জন্য ডিএফ সেল্ফ.মি_নেউ_ক্লাস_মোথারিক সিনট্যাক্স ব্যবহার করা আরও ভাল, কারণ কোডটি বুঝতে সহজ হয়। উপরের উদাহরণটি অন্তর্ভুক্ত করা হয়েছিল সুতরাং আমরা যখন ক্লাস << স্ব স্ব বাক্যবিন্যাসে এসে পড়ি তখন কী ঘটছে তা আমরা বুঝতে পারি।

রুবি ক্লাস সম্পর্কে অতিরিক্ত তথ্য এই পোস্টে পাওয়া যাবে ।


15

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

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


3

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

উদাহরণ:

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


1

বাস্তবে আপনি যদি আপনার রুবি প্রকল্পগুলির জন্য কোনও সি এক্সটেনশান লিখেন তবে মডিউল পদ্ধতিটি সংজ্ঞায়নের জন্য কেবলমাত্র একটি উপায় আছে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.