所以,我回来了另一个问题!我已经学习了如何接受带有块的参数,但现在需要在我的方法中放置一个块(我认为)。
这是我所要做的,它是一种通用的reduce
方法,并通过了以下测试:
describe 'my own reduce' do
it "returns a running total when not given a starting point" do
source_array = [1,2,3]
expect(reduce(source_array){|memo, n| memo + n}).to eq(6)
end
it "returns a running total when given a starting point" do
source_array = [1,2,3]
starting_point = 100
expect(reduce(source_array, starting_point){|memo, n| memo + n}).to eq(106)
end
it "returns true when all values are truthy" do
source_array = [1, 2, true, "razmatazz"]
expect(reduce(source_array){|memo, n| memo && n}).to be_truthy
end
it "returns false when any value is false" do
source_array = [1, 2, true, "razmatazz", false]
expect(reduce(source_array){|memo, n| memo && n}).to be_falsy
end
it "returns true when a truthy value is present" do
source_array = [ false, nil, nil, nil, true]
expect(reduce(source_array){|memo, n| memo || n}).to eq(true)
end
it "returns false when no truthy value is present" do
source_array = [ false, nil, nil, nil]
expect(reduce(source_array){|memo, n| memo && n}).to eq(false)
end
end
这是我的代码:
def reduce(element1, starting_point = 0, &block)
element1.reduce(starting_point, &block)
end
6个测试中的4个通过。但是最后一部分需要检查source_array
中的值,如果真值是true,则返回true,否则,则返回false。我尝试将以下代码块与reduce
方法一起放入:
def reduce(element1, starting_point = 0, &block)
element1.reduce(starting_point, &block){ |x, y| if x || y = true; p true; else p false; end}
end
如果查看测试,您会看到它将通过一个带有'true'的数组,并传递一个带有'false'的数组,我需要它对所有6个测试起作用。
请,任何解释都对我有很大帮助。
答案 0 :(得分:5)
reduce
,请不要在内部使用Enumerable#reduce
。您可以使用Enumerable#each
或for
/ while
循环method(arg1, arg2, &block)
一样将块传递给另一个方法。#call
来调用自己的信息块,例如block.call(arg1, arg2)
答案 1 :(得分:3)
由于要使用数字和布尔值,因此无法为starting_point
指定适用于所有用例的默认值。
如果您未指定starting_point
,则reduce
将仅使用前一个element as starting_point:
def reduce(elements, starting_point = nil, &block)
if starting_point.nil?
elements.reduce(&block)
else
elements.reduce(starting_point, &block)
end
end
答案 2 :(得分:2)
我认为测试失败应指定<creation day since whatever>.<time as fractals of the day>
。
starting_point
it "returns true when a truthy value is present" do
source_array = [ false, nil, nil, nil, true]
- expect(reduce(source_array){|memo, n| memo || n}).to eq(true)
+ expect(reduce(source_array, false){|memo, n| memo || n}).to eq(true)
end
的含义取决于左侧。 ||
与例如。 Integer#||
。他们是不同的方法。