0

您好,请查看我的代码并告诉我出了什么问题,因为它未能通过 rspec 但适用于 repl.it。我不明白来自 rspec 的反馈。失败/错误:n.should == 3 Expect: 3 Got: 0 (using==)

我的代码:

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

谢谢大家的帮助。

4

3 回答 3

1

这在控制台上也不起作用,因为n它是在方法的块范围内定义的repeater。您在控制台上看到的是times块返回的值,但如果您检查 n 的值,它仍然为零。

如果您将中继器方法更改为:

def repeater(x=0)
  if x == 0
    return yield
  else
    x.times do |n|
      yield
    end
  end
end 

然后规范将通过,因为对的引用n将由调用上下文给出

于 2013-06-25T06:38:26.470 回答
0

这是我对您的问题的解决方案。块和产量是强大的。还在学习自己掌握。

def 中继器(num=0, &block)

return block.call if num==0

   num.times do |n|
      block.call
   end

结尾

如果你想折射成一条线。见下文

def 中继器(num=0, &block)

  return block.call if num==0; num.times { |n| block.call}

结尾

于 2013-08-13T05:46:39.793 回答
0

Rspec 告诉你出了什么问题。您希望 n 为 3,但它为 0。

您的规格:

n = 0
repeater(3) do
  n +=1
end
n.should == 3

我不确定您为什么要传递一个块,因为它被完全忽略了,但也许您正在测试该块被忽略并且您的函数按预期执行。

如果给定一个非零值,您的函数将产生一个奇怪的循环。循环本身不做任何事情,循环产生的值是 be x

因此,如果传入的值非零,您对中继器的调用将返回传入的任何值。但是,这在您的规范中并不重要,因为您忽略了返回值。

所以你基本上将 n 设置为 0,不要对它做任何事情,然后期望它等于 3,这当然会失败。

于 2013-06-25T06:42:03.000 回答