ক্লাস পদ্ধতি তৈরি করতে আমি কীভাবে ডেফাইন_মোথড ব্যবহার করব?


108

আপনি যদি শ্রেণিবদ্ধ পদ্ধতি রূপকভাবে তৈরি করার চেষ্টা করছেন তবে এটি দরকারী is

def self.create_methods(method_name)
    # To create instance methods:
    define_method method_name do
      ...
    end

    # To create class methods that refer to the args on create_methods:
    ???
end

আমার উত্তর অনুসরণ করুন ...

উত্তর:


196

আমার মনে হয় রুবি ১.৯ এ আপনি এটি করতে পারেন:

class A
  define_singleton_method :loudly do |message|
    puts message.upcase
  end
end

A.loudly "my message"

# >> MY MESSAGE

4
এছাড়াওsingleton_class.define_method
পাইরো

@ পাইরো শুধু স্পষ্ট করে বলতে গেলে, আপনি কি ঠিক তাই যান singleton_class.define_method :loudly do |message|?
জোশুয়া পিন্টার

25

আমি সংজ্ঞায় কল করতে পাঠাতে পছন্দ করতে পছন্দ করি, এবং আমি মেটাক্লাস অ্যাক্সেসের জন্য একটি মেটাক্লাস পদ্ধতি তৈরি করতেও পছন্দ করি:

class Object
  def metaclass
    class << self
      self
    end
  end
end

class MyClass
  # Defines MyClass.my_method
  self.metaclass.send(:define_method, :my_method) do
    ...
  end
end

2
ধন্যবাদ! অবশ্যই নিজের জন্য এই সুন্দর করার উপায় আছে। তবে আপনি যদি ওপেন সোর্স প্লাগইনটিতে কাজ করছেন, উদাহরণস্বরূপ, আমি মনে করি যে নামস্থানটি বন্ধ করে রাখা ভাল নয় metaclass, সুতরাং এটি সহজ, স্বতন্ত্র শর্টহ্যান্ড জেনে ভাল।
চিনাসৌর

আমি আমার আসল উত্তরটি নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি। আমার বোঝা হ'ল রুবি ১.৯ এ চলে যাওয়ার পরে প্রাইভেট পদ্ধতিগুলি অ্যাক্সেস করতে প্রেরণ () ব্যবহার করে, যাতে এটি ব্যবহার করা ভাল জিনিস মনে হয় না। এছাড়াও যদি আপনি একাধিক পদ্ধতির সংজ্ঞা দিচ্ছেন, উদাহরণস্বরূপ_ একটি ব্লকের মূল্যায়ন ক্লিনার।
চিনাসৌর

@ ভিনসেন্ট রবার্টকে এমন কোনও লিঙ্ক আছে যা মেটাক্লাস পদ্ধতির যাদুটি ব্যাখ্যা করবে?
আমোল পূজারি

শ্রেণ << স্ব; স্ব; শেষ; কেবলমাত্র স্ব শ্রেণীর ক্লাসটি আবার খোলে (শ্রেণি << স্ব) এবং তারপরে সেই শ্রেণিটি (স্ব) ফিরিয়ে দেয় তাই প্রকৃতপক্ষে স্বের মেটাক্লাস ফিরিয়ে দেওয়া হয়।
ভিনসেন্ট রবার্ট

10

এটি রুবি ১.৮++ এর সহজতম উপায়:

class A
  class << self
    def method_name
      ...
    end
  end
end

1
আমি সত্যিই এই এক পছন্দ। ছোট, ঝরঝরে, ভাল পড়া এবং এটি বহনযোগ্য। অবশ্যই, আপনি জিজ্ঞাসা করতে পারেন যে আমি রুবি ১.৮ ব্যবহার করে কি করছি 2013
একটি ফাদার অন্ধকার

8

থেকে উত্পন্ন: জে এবং কেন , যারা এই প্রাকটিটিয়ার তৈরির উপায়ও সরবরাহ করে।

self.create_class_method(method_name)
  (class << self; self; end).instance_eval do
    define_method method_name do
      ...
    end
  end
end

আপডেট : নীচে ভিআর এর অবদান থেকে; আরও সংক্ষিপ্ত পদ্ধতি (যতক্ষণ না আপনি কেবলমাত্র একটি পদ্ধতি এইভাবে সংজ্ঞায়িত করছেন) এটি এখনও এককভাবে রয়েছে:

self.create_class_method(method_name)
  (class << self; self; end).send(:define_method, method_name) do
    ...
  end
end

তবে মনে রাখবেন যে Define_method () এর মতো ব্যক্তিগত পদ্ধতিতে অ্যাক্সেস প্রেরণ () ব্যবহার করা ভাল ধারণা নয় (আমার বোঝা এটি রুবি ১.৯-এ চলে যাচ্ছে)।


আরও ভাল (?) বিকল্প হতে পারে জিনিসগুলিকে মডিউলে রাখা এবং তারপরে আপনার ক্রিয়ে_ক্লাস_মোথডোটি মডিউলটিকে ক্লাসে প্রসারিত করতে পারে ??? দেখুন: blog.jayfields.com/2008/07/ruby-unduse-of-modules.html
চিনাসৌর

6

ক্লাসের পদ্ধতিগুলি উদ্বেগ থেকে গতিময়ভাবে সংজ্ঞায়িত করতে চাইলে কারাগারে ব্যবহৃত হবে:

module Concerns::Testable
  extend ActiveSupport::Concern

  included do 
    singleton_class.instance_eval do
      define_method(:test) do
        puts 'test'
      end
    end
  end
end

-1

আপনি সংজ্ঞায়িত_মোথাদের উপর নির্ভর না করে এই জাতীয় কিছু করতেও পারেন:

A.class_eval do
  def self.class_method_name(param)
    puts param
  end
end

A.class_method_name("hello") # outputs "hello" and returns nil
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.