1

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、メソッドとしては機能しません。どうすればそれを機能させることができますか?

4

2 に答える 2

0

この回答は、尋ねられたように実際のメソッドを使用していませんが、 aProcまたは changeを返す必要はありませんでした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
于 2013-05-03T11:55:09.963 に答える
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
于 2013-04-24T17:00:49.177 に答える