Ruby Proc: استدعاء الطريقة من الفئة A من داخل الفئة B ، واستخدام "طريقة" الفئة B

StackOverflow https://stackoverflow.com/questions/4083794

  •  28-09-2019
  •  | 
  •  

سؤال

لست متأكدًا مما إذا كان هذا ممكنًا بالفعل ، لكنني لم أتمكن من العثور على إجابة واضحة في أي مكان. كما أجد صعوبة في تحديد سؤالي في مجرد "مصطلحات البحث". لذلك أنا آسف إذا تم الرد على هذا بالفعل في مكان آخر ، لم أتمكن من العثور عليه.

ما أود معرفته هو ما إذا كان من الممكن إنشاء proc يحمل طريقة لم يتم تعريفها في الموقع الذي يتم فيه تعريف Proc. بعد ذلك ، أود أن أضع هذه الحالة داخل فئة أخرى لها الطريقة ، وتشغيل تلك الحجج المقدمة.

إليكم عينة مما أريد إنجازه ، لكن لا أعرف كيف.

class MyClassA

  # This class does not have the #run method
  # but I want Class B to run the #run method that
  # I invoke from within the Proc within this initializer
  def initialize
    Proc.new { run 'something great' }
  end

end

class MyClassB

  def initialize(my_class_a_object)
    my_class_a_object.call
  end

  # This is the #run method I want to invoke
  def run(message)
    puts message
  end

end

# This is what I execute
my_class_a_object = MyClassA.new
MyClassB.new(my_class_a_object)

يتم إنتاج الخطأ التالي

NoMethodError: undefined method  for #<MyClassA:0x10017d878>

وأعتقد أنني أفهم السبب ، فذلك لأنه يحاول استدعاء run طريقة على MyClassA مثيل بدلاً من واحد في MyClassB. ومع ذلك ، هل هناك طريقة يمكنني صنعها run استدعاء القيادة MyClassBrun طريقة مثيل؟

هل كانت مفيدة؟

المحلول

هناك مشكلتان في الكود الخاص بك:

  1. MyClassA.new لا يعيد قيمة initialize إنه يعيد دائمًا مثيلًا MyClassA.

  2. لا يمكنك فقط الاتصال بـ Proc ، عليك استخدام instance_eval طريقة لتشغيلها في سياق MyClassB

إليك رمزك مصحح للعمل كما تريد:

class MyClassA    
  def self.get_proc
    Proc.new { run 'something great' }
  end
end

class MyClassB

  def initialize(my_class_a_object)
   instance_eval(&my_class_a_object)
  end

  # This is the #run method I want to invoke
  def run(message)
    puts message
  end

end

# This is what I execute
my_class_a_object = MyClassA.get_proc
MyClassB.new(my_class_a_object) #=> "something great"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top