Ruby Proc:从类B中调用A类中的方法,并使用B类的'方法'

时间:2010-11-03 02:27:44

标签: ruby lambda proc-object

我不确定这是否真的可行,但我无法在任何地方找到明确答案。此外,我发现很难用“搜索术语”来定义我的问题。所以我很抱歉,如果已经在其他地方回答过,我找不到它。

我想知道的是,是否可以创建一个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的{​​{1}}实例方法?

1 个答案:

答案 0 :(得分:2)

您的代码存在两个问题:

  1. MyClassA.new不返回initialize的值,它始终返回MyClassA的实例。

  2. 您不能只调用proc,您必须使用instance_eval方法在MyClassB

  3. 的上下文中运行它

    以下是您的代码已更正为您所需的工作:

    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"