Ruby Proc: вызов метода из класса A из класса B и использование «метода» класса B - PullRequest
0 голосов
/ 03 ноября 2010

Я не уверен, возможно ли это на самом деле, но я нигде не смог найти четкого ответа.Также мне трудно определить мой вопрос просто в «поисковых терминах».Поэтому я извиняюсь, если на этот вопрос уже ответили где-то еще, я не смог его найти.

Я хотел бы знать, возможно ли создать 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?

1 Ответ

2 голосов
/ 04 ноября 2010

Есть две проблемы с вашим кодом:

  1. MyClassA.new не возвращает значение initialize, оно ВСЕГДА возвращает экземпляр MyClassA.

  2. Вы не можете просто вызвать процедуру, вы должны использовать метод 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"
...