0

我正在尝试执行以下操作:

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_testTester.new.run工作?

4

2 回答 2

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
于 2013-08-06T12:43:00.853 回答
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返回 a nil,您仍然可以在其上调用这些方法。

基本上,你不能Proc像那样存储方法。它在第二个示例中起作用的事实完全是侥幸。

于 2013-08-06T13:18:19.733 回答