রুবিতে সিঙ্গলটন ক্লাসটি ঠিক কী?


85

রুবির সিঙ্গলটন ক্লাস কি নিজেই ক্লাসে আছে? সমস্ত কারণ "শ্রেণীর" অন্তর্ভুক্ত হওয়ার কারণ কি? ধারণাটি অস্পষ্ট , তবে আমি বিশ্বাস করি যে আমি কেন কোনও শ্রেণিবদ্ধকরণ ( class foo; def foo.bar ...) মোটেই সংজ্ঞায়িত করতে পারি তার সাথে এর কিছু সম্পর্ক রয়েছে to

রুবিতে সিঙ্গলটন ক্লাস কী?

উত্তর:


154

প্রথমত, একটি ছোট সংজ্ঞা: একটি সিঙ্গলটন পদ্ধতি এমন একটি পদ্ধতি যা কেবলমাত্র একটিমাত্র বস্তুর জন্য সংজ্ঞায়িত হয়। উদাহরণ:

irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
        from (irb):8

তাত্ক্ষণিক পদ্ধতিগুলি কোনও শ্রেণির পদ্ধতি (যেমন শ্রেণীর সংজ্ঞাতে সংজ্ঞায়িত)। ক্লাসের পদ্ধতিগুলি ক্লাসের Classউদাহরণে সিঙ্গলটন পদ্ধতি - সেগুলি শ্রেণীর সংজ্ঞায়িত হয় না। পরিবর্তে, তারা বস্তুর একক ক্লাসে সংজ্ঞায়িত করা হয় ।

irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false

আপনি সিনট্যাক্সের সাহায্যে একটি সামগ্রীর সিঙ্গলটন শ্রেণি খুলুন class << obj। এখানে, আমরা দেখতে পাচ্ছি যে এই সিঙ্গলটন ক্লাসটি যেখানে সিঙ্গলটন পদ্ধতিগুলি সংজ্ঞায়িত করা হয়েছে:

irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false

সুতরাং কোনও বস্তুর সাথে সিঙ্গেলটন পদ্ধতি যুক্ত করার বিকল্প উপায়টি হ'ল বস্তুর সিঙ্গলটন শ্রেণীর উন্মুক্ত সাথে তাদের সংজ্ঞা দেওয়া:

irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false

সংক্ষেপে:

  • পদ্ধতিগুলি সর্বদা একটি শ্রেণীর অন্তর্ভুক্ত থাকে (বা: কোনও শ্রেণির উদাহরণ পদ্ধতিতে)
  • সাধারণ পদ্ধতিগুলি শ্রেণীর অন্তর্ভুক্ত যার মধ্যে তারা সংজ্ঞায়িত হয় (যেমন শ্রেণীর উদাহরণ পদ্ধতিগুলি)
  • ক্লাস পদ্ধতিগুলি কেবলমাত্র সিঙ্গলটন পদ্ধতি Class
  • কোনও বস্তুর একক পদ্ধতিগুলি বস্তুর শ্রেণির উদাহরণ পদ্ধতি নয়; বরং তারা হ'ল বস্তুর একক শ্রেণীর উদাহরণ।

17
আমার হেডস্টোনে এটি বলবে "আরআইপি রুবি সিঙ্গলটন P পিস্টস আমার বিচক্ষণতা বাঁচিয়েছে।"
rmchaharry

4
@ সাওয়া আমি আপনার সম্পাদনাগুলির উদ্দেশ্যটির প্রশংসা করি, তবে আমি অনুভব করি যে তারা আমার পোস্টটির অর্থ এবং যোগাযোগকে কিছুটা পরিবর্তন করেছে, তাই আমি আপনার সম্পাদনাগুলি আবার ঘুরিয়েছি।
পিস্তোস

33

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


    foo = Array.new
    def foo.size
      "Hello World!"
    end
    foo.size  # => "Hello World!"
    foo.class # => Array
    #Create another instance of Array Class and call size method on it
    bar = Array.new
    bar.size  # => 0
সিঙ্গলটন শ্রেণি অবজেক্ট নির্দিষ্ট বেনাম শ্রেণি যা স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায় এবং উত্তরাধিকারের শ্রেণিবিন্যাসে sertedোকানো হয়।

singleton_methods কোনও বস্তুর একক পদ্ধতির সমস্তগুলির জন্য নামের তালিকা পেতে কোনও অবজেক্টকে ডাকা যেতে পারে।

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

এই নিবন্ধটি আমাকে সত্যই রুবিতে সিঙ্গলটন ক্লাস বুঝতে সাহায্য করেছে এবং এটির একটি ভাল কোড উদাহরণ রয়েছে।


4
যদিও এই উত্তরটি এক বছরেরও বেশি পুরানো এবং লিঙ্কটি সহায়ক, আপনি যদি উত্তরের প্রয়োজনীয় অংশগুলি এখানে, এই সাইটে পোস্ট করেন বা আপনার পোস্টের ঝুঁকি মুছে ফেলা যায় তবে ভাল হবে যেখানে FAQ দেখুন যেখানে এটি উল্লেখ করা হয়েছে যে 'সবেমাত্র বেশি একটি লিঙ্ক চেয়ে '। আপনি চাইলে লিঙ্কটি অন্তর্ভুক্ত করতে পারেন তবে কেবল 'রেফারেন্স' হিসাবে। উত্তরটি লিঙ্কটির প্রয়োজন ছাড়াই নিজেরাই দাঁড়ানো উচিত।
তারিন

এখানে @ ব্লুফিয়েটের সাথে একমত
সৌরভ

ধন্যবাদ @ ব্লুফিট, আপনার মন্তব্যে সম্বোধনের উত্তর আপডেট করেছেন।
বেদাসো

7

কেবলমাত্র @ পিস্তোস জবাব আপডেট করুন, সংস্করণ 1.9.2 থেকে রুবি সিঙ্গলটন ক্লাসে নতুন সিনট্যাক্স যুক্ত করুন

 singleton_class = ( class << foo; self; end )

এর সাথে প্রতিস্থাপন করা যেতে পারে:

singleton_class = foo.singleton_class

https://apidock.com/ruby/Object/singleton_class


4

এটি (আইএমএইচও) ভাবার সর্বাধিক ব্যবহারিক / ক্রিয়া-oreinted উপায় হ'ল: উত্তরাধিকার শৃঙ্খলা বা পদ্ধতি অনুসন্ধান / রেজোলিউশন ক্রম হিসাবে। এই ছবিটি সাহায্য করতে পারে

http://www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-incolve-class/

এটি বিল্টিন এবং ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর বিপরীতে 1.9 হ'ল আমি এখনও এইটি হজম করছি।

http://d.hatena.ne.jp/sumim/20080111/p1

এছাড়াও, আমি এই শব্দটির একটি বিভ্রান্তিমূলক ব্যবহারটি হ'ল "সিঙ্গেলটন অবজেক্ট", যা ভিন্ন ধারণা। একটি সিঙ্গলটন অবজেক্ট এমন কোনও ক্লাস থেকে আসে যার নির্মাণকারীর / ইনস্ট্যান্টিয়েটার পদ্ধতিটি ওভাররাইড করা হয় যাতে আপনি class শ্রেণির মধ্যে কেবল একটি বরাদ্দ করতে পারেন।


একটি লিঙ্ক মারা গেছে। আর অন্যটি জাপানি!
ইউলিস বিএন

0

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

class User; end
user = User.new
def user.age
  "i'm a unique method"
end
user1 = User.new 
user.age #"i'm a unique method"
user1.age # NoMethodError (undefined method `age' for #<User:0x0000559c66ab7338>)

আপনি উপরে দেখতে পারেন, ব্যবহারকারীর 1 অবজেক্টটি 'বয়স' পদ্ধতিতে সাড়া দেয় না কারণ এটি একটি সিঙ্গলটন পদ্ধতি, এমন একটি পদ্ধতি যা ব্যবহারকারী অবজেক্টে স্বতন্ত্রভাবে সংজ্ঞায়িত। এটি হওয়ার জন্য, রুবি এই অনন্য পদ্ধতিটি হোস্ট করার জন্য সিঙ্গেলটন ক্লাস বা আইজেনক্লাস নামে একটি বিশেষ শ্রেণি তৈরি করে। আপনি নিম্নলিখিতটি দ্বারা যাচাই করতে পারেন:

user.singleton_class # #<Class:#<User:0x0000559c66b47c58>>

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

user_singleton_class = user.method(:age).owner # #<Class:#<User:0x0000559c66b47c58>>
user.method(:age).owner == user.singleton_class # true
user_singleton_class.instance_methods(false) # [:age]

আরও মনে রাখবেন যে, একটি সিঙ্গলটন ক্লাস যতদূর যায়, সিঙ্গলটন পদ্ধতিগুলি আসলে এটির উদাহরণ পদ্ধতি।

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