1

スタブ クラスを返すラムダを作成しようとしています。これは私が持っているものです:

engine_stub = lambda { |valid|
  Class.new {
    def valid?(address)
      valid
    end
  }
}

valid?ラムダは、インスタンス メソッドが常にラムダに渡された値を返すクラスを返す必要があります。このコードは次のエラーで失敗します。

NameError: undefined local variable or method `valid' for #<#<Class:0x007f4bf0ebd
0f0>:0x007f4bf0ebcd08>

したがって、メソッドがラムダ スコープにアクセスできないことは明らかです。私もこれを試しました:

engine_stub = lambda { |valid|
  stub_class = Class.new
  def stub_class.valid?(address)
    valid
  end
  return stub_class
}

代わりに、次のエラーが発生します。

NoMethodError: undefined method `valid?' for #<#<Class:0x007fecbada1138>:0x007fec
bada0df0>

valid?そのため、インスタンス変数の作成に失敗しました。

概要

ラムダに渡された値を返すengine_stub1つのインスタンスメソッドを持つクラスを返すようにラムダを取得しようとしています。valid?どうすればいいですか?

4

2 に答える 2

6

キーワードdefはスコープ ゲートであるため、次の方法でメソッドを定義する必要があります。define_method{}

engine_stub = -> valid do
  Class.new { define_method :valid? do valid end }
end
于 2013-06-07T09:11:24.767 に答える