您好,请查看我的代码并告诉我有什么问题,因为它失败了rspec但是在repl.it上工作。我不理解rspec的反馈。 失败/错误:n.should == 3 期待:3 得到:0(使用==)
我的代码:
def repeater(x=0)
if x == 0
return yield
else
x.times do |n|
n += 1
end
end
end
它通过了以下第一次测试:
describe "repeater" do
it "executes the default block" do
block_was_executed = false
repeater do
block_was_executed = true
end
block_was_executed.should == true
end
it "executes the default block 3 times" do
n = 0
repeater(3) do
n += 1
end
n.should == 3
end
it "executes the default block 10 times" do
n = 0
repeater(10) do
n += 1
end
n.should == 10
end
end
感谢您的帮助。
答案 0 :(得分:1)
这在控制台上也不起作用,因为n
是在repeater
方法的块范围内定义的。您在控制台上看到的是times
块返回的值,但如果您检查n的值,它仍将为零。
如果您将转发器方法更改为:
def repeater(x=0)
if x == 0
return yield
else
x.times do |n|
yield
end
end
end
然后规范将通过,因为n
的引用将由调用上下文给出
答案 1 :(得分:0)
Rspec告诉你出了什么问题。你希望n为3,但它是0。
您的规范:
n = 0
repeater(3) do
n +=1
end
n.should == 3
我不确定你为什么要传递一个块,因为它被完全忽略了,但是你可能正在测试该块被忽略而且你的函数按预期运行。
如果给定非零值,您的函数将产生一个奇怪的循环。循环本身不做任何事情,循环产生的值为x
。
因此,对转发器的调用将返回传入的任何值,如果它不为零。但是,由于您忽略了返回值,因此在您的规范中无关紧要。
所以你基本上把n设置为0,不要对它做任何事情,然后期望它等于3当然会失败。
答案 2 :(得分:0)
这是我解决您问题的方法。块和产量很强大。还在学习自己掌握它。
def repeater(num = 0,& block)
return block.call if num==0
num.times do |n|
block.call
end
端
如果你想折射成一行。见下文
def repeater(num = 0,& block)
return block.call if num==0; num.times { |n| block.call}
端