2013-04-24 73 views
1

我想打电话给instance_eval这个类:如何将方法传递给instance_eval?

class A 
    attr_reader :att 
end 

通过这个方法b

class B 
    def b(*args) 
    att 
    end 
end 

,但这种情况正在发生:

a = A.new 
bb = B.new 
a.instance_eval(&bb.method(:b)) # NameError: undefined local variable or method `att' for #<B:0x007fb39ad0d568> 

b是它的工作原理块,但b作为一种方法不起作用。我怎样才能使它工作?

回答

0

这个答案不使用真实的方法,问过,但我并不需要返回一个Proc或改变A。这是一个DSL,def_b应该对域具有有意义的名称,如configure,并且它更可能在模块或基类中定义。

class B 
    class << self 
    def def_b(&block) 
     (@b_blocks ||= []) << block 
    end 

    def run 
     return if @b_blocks.nil? 
     a = A.new 
     @b_blocks.each { |block| a.instance_eval(&block) } 
    end 
    end 

    def_b do 
    a 
    end 
end 

它接受多个定义。它可以被接受只有这样一个单一的定义:

class B 
    class << self 
    def def_b(&block) 
     raise "b defined twice!" unless @b_block.nil? 
     @b_block = block 
    end 

    def run 
     A.new.instance_eval(&@b_block) unless @b_block.nil? 
    end 
    end 

    def_b do 
    a 
    end 
end 
0

目前尚不清楚你的目标是什么。您可以轻松地在每类模块中定义它们,包括模块共享类之间的方法

module ABCommon 
    def a 
    'a' 
    end 
end 

class A 
    include ABCommon 
end 

Anything = Hash 
class B < Anything 
    include ABCommon 

    def b(*args) 
    a 
    end 

    def run 
    puts b 
    end 
end 
+0

我想在该类的国家。 – michelpm 2013-04-24 17:04:15

+0

请参阅编辑。我想我现在更清楚了。 – michelpm 2013-04-24 17:13:09