2013-04-24 70 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