尝试执行以下操作:
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
工作时我缺少什么?
答案 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
中。它在第二个例子中起作用的事实是完全侥幸。