Ruby Proc: استدعاء الطريقة من الفئة A من داخل الفئة B ، واستخدام "طريقة" الفئة B
-
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
استدعاء القيادة MyClassB
'س run
طريقة مثيل؟
المحلول
هناك مشكلتان في الكود الخاص بك:
MyClassA.new
لا يعيد قيمةinitialize
إنه يعيد دائمًا مثيلًاMyClassA
.لا يمكنك فقط الاتصال بـ 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"