কোন শ্রেণি পদ্ধতির জন্য একটি উপনাম_মথার আছে?


10

নিম্নলিখিত শ্রেণীর বিবেচনা করুন:

class Foo
  def an_inst_method
    'instance method'
  end

  def self.a_class_method
    'class method'
  end

  alias_method :a_new_inst_method, :an_inst_method
end

এটি কোনও সমস্যা নয় এবং আপনি Foo.new.a_new_inst_methodকোনও সমস্যা ছাড়াই কল করতে পারেন ।

আমি এর মতো ক্লাসের পদ্ধতি Foo.add_widget(*items)এবং এটির নাম রাখার দক্ষতা চাই যাতে আমি এর মতো কিছু করতে পারি:

Foo.add_widget 'item1'
Foo.add_widgets 'item2', 'item3'

সুতরাং মূলত এটির "রুবি স্টাইল" এর মতো থাকে 1.minuteএবং 2.minutesতাই আমি একটি একই Foo.add_widgetকলিং Foo.add_widgetsঠিক একই পদ্ধতিতে কল করতে পারি। আমি জানি যে আমি এটি মোড়ানো করতে পারি তবে আমার মনে হয় আমার এটি আরও পরিষ্কার ফ্যাশনে করা উচিত।

এই জাতীয় কিছু চেষ্টা করার জন্য আমার প্রচেষ্টা বিবেচনা করুন:

class Foo
  def an_inst_method
    'instance method'
  end

  def self.a_class_method
    'class method'
  end

  alias_method :a_new_inst_method, :an_inst_method
  alias_method :a_new_class_method, :a_class_method
end

তবে, আমি নিম্নলিখিত ত্রুটি পেয়েছি:

NameError (undefined method `a_class_method' for class `Foo')

এবং তাই দেখে মনে হচ্ছে এটি শ্রেণিবদ্ধ পদ্ধতিতে কাজ করে না। কিভাবে আমি এই কাজ সম্পর্কে যান?

উত্তর:


9

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

class MyClass
  def self.a
    "Hello World!"
  end
end

method_1 = MyClass.method(:a).unbind
method_2 = MyClass.singleton_class.instance_method(:a)

method_1 == method_2
#=> true

সিঙ্গেলটন ক্লাসে সংজ্ঞায়িত একটি উদাহরণ পদ্ধতিটির জন্য আপনি এটি ব্যবহার করে এটি খুলতে পারেন class << object বাক্য গঠন ।

class << MyClass
  alias_method :b, :a
end

MyClass.b
#=> "Hello World!"

অথবা আপনি সরাসরি এটি ব্যবহার করে উল্লেখ করতে পারেন singleton_class পদ্ধতিটি ।

MyClass.singleton_class.alias_method :c, :a

MyClass.c
#=> "Hello World!"

আপনি যদি এখনও শ্রেণি প্রসঙ্গে থাকেন self উল্লেখ করবে। সুতরাং উপরোক্ত হিসাবে এটি লেখা যেতে পারে:

class MyClass
  class << self
    def a
      "Hello World!"
    end
    alias_method :b, :a
  end
end

অথবা

class MyClass
  def self.a
    "Hello World!"
  end
  singleton_class.alias_method :c, :a
end

অথবা দুজনের সমন্বয়।


5

আপনি ক্লাসের পদ্ধতিগুলি এবং তাদের alias_methodকলগুলি একটি পৃথক মডিউলে গুটিয়ে রাখতে পারেন এবং এই মডিউলটিকে আপনার ক্লাসে অন্তর্ভুক্ত করুন এর মাধ্যমে extend:

class Foo
  def an_inst_method
    'instance method'
  end
  alias_method :a_new_inst_method, :an_inst_method

  module ClassMethods
    def a_class_method
      'class method'
    end
    alias_method :a_new_class_method, :a_class_method
  end

  extend ClassMethods
end

হে! আমি extend ClassMethodsসমাধান সম্পর্কে ভুলে গেছি । +1
অ্যারোনা

4

বোঝার জন্য গুরুত্বপূর্ণ বিষয়টি হ'ল শ্রেণি পদ্ধতি হিসাবে এমন কোনও জিনিস নেই রুবিতে শ্রেণিক ।

একটি শ্রেণি পদ্ধতি সত্যই কেবল একটি সিঙ্গলটন পদ্ধতি। শ্রেণি পদ্ধতি সম্পর্কে বিশেষ কিছু নেই। প্রতিটি বস্তুর একক পদ্ধতি থাকতে পারে। আমরা কেবল তখন তাদের "শ্রেণি পদ্ধতি" বলি যখন বস্তুটি Classকারণ হিসাবে "উদাহরণের একক পদ্ধতি"Class " খুব দীর্ঘ এবং অনর্থক হয়।

অপেক্ষা কর আমি কি "সিঙ্গলটন পদ্ধতি" বলেছিলাম?

আরেকটি গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে সিঙ্গলটন পদ্ধতি হিসাবে এমন কোনও জিনিস নেই রুবিতে ।

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

আসলে, রুবি কেবল আছে উদাহরণ পদ্ধতি instance কোনও ফাংশন, কোনও নির্মাণকারী, স্ট্যাটিক পদ্ধতি, কোনও শ্রেণি পদ্ধতি, কোনও মডিউল ফাংশন, কোনও সিঙ্গলটন পদ্ধতি নেই।

প্রশ্নটি নয় "এটি কি একটি শ্রেণিবদ্ধ পদ্ধতি, এটি কি একটি একক পদ্ধতি", বরং " এই পদ্ধতিটি কোন মডিউলে সংজ্ঞায়িত করা হয়েছে?"

"সিঙ্গেলটন পদ্ধতি" হ'ল প্রকৃত উদাহরণ পদ্ধতি যা একক ক্লাসে সংজ্ঞায়িত হয়। এর Singleton বর্গ ব্যবহার করার জন্য সিনট্যাক্স fooহল

class << foo
end

এমন একটি পদ্ধতিও রয়েছে Object#singleton_classযা কোনও অবজেক্টের সিঙ্গলটন ক্লাস প্রদান করে।

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

একবার আপনি বুঝতে পারবেন যে প্রতিটি পদ্ধতি একটি উদাহরণ পদ্ধতি, এবং আমরা "সিঙ্গেলটন পদ্ধতি" যাকে বলি কেবল সিঙ্গলটন শ্রেণির উদাহরণ উদাহরণ, সমাধানটি পরিষ্কার হয়ে যায়:

singleton_class.alias_method :a_new_class_method, :a_class_method

দ্রষ্টব্য: যখন আমি উপরে লিখেছিলাম যে "এক্স" এর মতো কোনও জিনিস নেই, তখন আমার অর্থ হ'ল " রুবি ভাষায় এক্স এর মতো কোনও জিনিস নেই "। এর অর্থ এই নয় যে এই ধারণাগুলি রুবি সম্প্রদায়ের মধ্যে নেই

আমরা নিয়মিত "সিঙ্গেলটন পদ্ধতি" এবং "শ্রেণি পদ্ধতি" সম্পর্কে কথা বলি, কেবল "সিঙ্গলটন শ্রেণীর উদাহরণ পদ্ধতি" বা "কোনও বস্তুর সিঙ্গলটন শ্রেণীর উদাহরণ পদ্ধতিগুলির কথা বলা যা Classশ্রেণীর উদাহরণ হিসাবে ঘটে তার চেয়ে সহজ" কারণ "। মত এমনকি পদ্ধতি Object#define_singleton_method, Object#singleton_method, Object#singleton_methods, Module#private_class_method, Module#public_class_method, এবং Module#module_functionএ রুবি কোর গ্রন্থাগার। তয় এইটা সবসময়ের জন্য মনে রাখা উচিত যে যারা গুরুত্বপূর্ণ না ভাষা ধারণা। সেগুলি এমন সম্প্রদায় ধারণাগুলি যা কেবলমাত্র আমাদের মাথায় এবং কয়েকটি গ্রন্থাগার পদ্ধতির নামে বিদ্যমান ।


2

ঠিক আছে, দেখে মনে হচ্ছে আমি এই জাতীয় কিছু করতে পারি এবং এটি কার্যকর হবে:

class Foo
  def an_inst_method
    'instance method'
  end

  def self.a_class_method
    'class method'
  end

  alias_method :a_new_inst_method, :an_inst_method

  class << self
    alias_method :a_new_class_method, :a_class_method
  end
end

Foo.a_class_method # => "class method" 
Foo.a_new_class_method # => "class method"

এখানে কারও কাছে রুবি ভাষা সম্পর্কে কোনও দরকারী তথ্য রয়েছে এবং একটি বিস্তৃত উত্তর জমা দিতে চাইলে আমি আপনাকে একটি +1 দেব।


1
আপনি যখন class << selfঅনুসরণ করেন তখন alias_method :a_new_class_method, :a_class_methodপ্রকৃতপক্ষে alias_methodসিঙ্গলটন ক্লাসের প্রতি আহ্বান জানান Foo। এটি লেখার আর একটি উপায় হ'ল singleton_class.alias_method :a_new_class_method, :a_class_methodশ্রেণি প্রসঙ্গে।
3limin4t0r

আপনি উত্তর থেকে আরও কি চান? মানে, সম্ভবত এটিই সবচেয়ে পরিষ্কার সমাধান।
ডেভ নিউটন

@ 3limin4t0r আপনি যদি এই উত্তরটি দিয়ে থাকেন তবে আমি এটি +1 করব। এই অতিরিক্ত তথ্যের জন্য ধন্যবাদ।
অ্যারোনা

@ ডেভিনিউটন আপনি ঠিক বলেছেন তবে আমারও একটি দর্শন আছে যে কেউ যদি কোনও সমস্যার পরোক্ষভাবে সমস্যার সমাধান করেও আরও কিছু অর্থবহ তথ্য সরবরাহ করতে পারে তবে আমি মনে করি এটিরও পুরস্কৃত হওয়া উচিত।
অ্যারোনা

2

alias_methodউদাহরণটিতে কাজ করে, তাই আপনাকে আরও একটি স্তর থেকে গভীরতর হওয়া প্রয়োজন এবং Classউদাহরণে কাজ করতে হবে বা ক্লাসের 'মেটাক্লাস । রুবির একটি বন্য বস্তুর মডেল রয়েছে যা মস্তিষ্ক ভাঙার মতো হতে পারে তবে এটি আপনাকে একটি টন শক্তিও দেয়:

class Foo
  def an_inst_method
    'instance method'
  end

  alias_method :a_new_inst_method, :an_inst_method

  class << self
    def a_class_method
      'class method'
    end

    alias_method :a_new_class_method, :a_class_method
  end
end

আমি প্রায় এক দশক ধরে রেলপথের প্রসঙ্গে রুবির সাথে কাজ করছি তবে সম্প্রতি সম্প্রতি অবজেক্টের মডেলটিতে গভীর ডুব দেওয়া শুরু করেছি। অনেক দুর্দান্ত জিনিস উপলব্ধ!
অ্যারোনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.