类中的嵌套方法(并使用Proc)

时间:2013-08-06 11:55:00

标签: ruby nested proc

尝试执行以下操作:

class Tester
  def some_test
    Proc.new do
      def prep_test
      end

      def do_test
      end

      def pass?
      end
    end
  end

  def another_test
    Proc.new ..
      ...
    end
  end

  # tests are mapped in array_of_tests

  def run
    array_of_tests.each do |t|
      t.call.prep_test
      t.call.do_test
      t.call.pass?
    end
  end
end

Tester.new.run

但是当我开始尝试执行每个测试t时,我会得到类似的结果:

NoMethodError: undefined method `prep_test' for nil:NilClass

在实验中,我发现这有效:

def test3
  Proc.new do
    def prep
      "running test3: prep"
    end

    def run
      "running test3: run"
    end

    def verify
      "running test3: verify"
    end
  end
end

t = test3
t.call.prep
t.call.run
t.call.verify

但这不属于班级。

我在some_test中引用嵌套方法以使Tester.new.run工作时我缺少什么?

2 个答案:

答案 0 :(得分:2)

卫生署!

def homer
  Class.new do
    def beer
      puts 'mmmm beer'
    end

    def donuts
      puts 'aaaauugggh dooooooooonuts!'
    end
  end    
end

homer.new.beer

如果您需要传递任何变量,请以旧式方式进行。

Tester方法超出了您生成的匿名类的范围。

但你可以做的是使用实例变量来引用测试人员。

class Scenario
  def test3
    Class.new do
      attr_reader :environment
      def initialize environment
        @environment = environment
      end

      def run
        environment.blah
      end
    end
  end
end

scenario = Scenario.new
scenario.test3.new(scenario).run

答案 1 :(得分:0)

这也可行

class Tester
  def some_test
    Proc.new do
      def Object.prep_test
      end

      def Object.do_test
      end

      def Object.pass?
      end
    end
  end
end

只是为了澄清你的两个例子中发生了什么;当你执行Proc时,它定义了正在执行它的任何类的方法。所以在第一个例子中,它在Tester类上定义它们。在第二个示例中,它在Object上定义它们。第二个示例仅适用,因为NilClass类继承自Object,因此即使Proc返回nil,您仍然可以在其上调用这些方法。

基本上,您不能将方法存储在Proc中。它在第二个例子中起作用的事实是完全侥幸。