使用接受块并可以返回真值或假值的方法

时间:2019-07-01 15:49:34

标签: ruby methods reduce

所以,我回来了另一个问题!我已经学习了如何接受带有块的参数,但现在需要在我的方法中放置一个块(我认为)。

这是我所要做的,它是一种通用的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个测试起作用。

请,任何解释都对我有很大帮助。

3 个答案:

答案 0 :(得分:5)

  1. 如果您要写自己的reduce,请不要在内部使用Enumerable#reduce。您可以使用Enumerable#eachfor / while循环
  2. 您可以像使用method(arg1, arg2, &block)一样将块传递给另一个方法。
  3. 您可以使用#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#||。他们是不同的方法。