2010-11-03 66 views
0

我不确定这是否实际可行,但我无法在任何地方找到明确的答案。另外,我发现很难仅以“搜索条件”来定义我的问题。所以我很抱歉,如果这已经在别的地方回答,我找不到它。Ruby Proc:从B类中的A类调用方法,并使用B类'方法'

我想知道的是,如果可以创建一个Proc,该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> 

我想我明白为什么,这是因为它试图调用的MyClassA实例,而不是一个在MyClassBrun方法。但是,有没有办法让run命令调用MyClassBrun实例方法?

回答

2

有两个问题与您的代码:

  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" 
+0

谢谢m8!对不起,这是我想要做的一个坏例子。这实际上并不是我遇到的实际问题,但是在这里添加一个很复杂,所以我写了一个很快的答案。使用初始化方法犯了错误,正如你所说的那样,当然会返回实例。感谢您的解决方案! :) – 2010-11-04 05:02:43

相关问题