返回从ruby

时间:2015-07-14 00:59:16

标签: ruby methods yield

我刚刚在bloc.io开始了一个全栈开发者课程,我正在努力完成任务。我似乎无法找到我的代码的问题,但我也不清楚该任务可能要求的内容。任何指导将不胜感激。该作业给出了以下示例。我为这篇文章的篇幅道歉,但我希望尽可能彻底。

  def return_bigger(array)
      array.map do |item|
        yield(item)
      end
    end

return_bigger([1,2,3,4]) do |item|
  item + 1000
end
#=> [1001, 1002, 1003, 1004] 

return_bigger(["cat", "hat", "bat"]) do |item|
  item.capitalize
end
#=> ["Cat", "Hat", "Bat"]
new_each([1,2,3,4]) do |item|
  p "Whatever I want! Item: #{item}"
end
def new_each(array)
  0.upto(array.length - 1) do |index|
    yield( array[index] )
  end
end

然后按如下方式描述分配:

定义new_map函数。它应该将数组作为参数,并返回根据作为块传入的指令修改的新数组。随意在方法中使用每个,而不是我们上面使用的数组索引。

重新实现map的第一步应该是迭代数组:

def new_map(array)
  array.each do |item|
  end
end

new_map方法与我们的new_each方法非常相似,但不是仅仅对每个元素执行“副作用”行为,您需要将每个块调用的返回值存储在一个新数组中:

def new_map(array)
  new_array = []
  array.each do |item|
    # invoke the block, and add its return value to the new array
  end
end

当您完成对旧数组的迭代后,只需从new_map函数返回新数组。

从我能理解的,作业要求我在不使用.map的情况下复制new_each方法,然后将其存储在“new_array”中。但是,我不确定我的代码中的缺陷是什么。有没有理由我的代码没有“让步”我定义的块?这是我提出的代码:

def new_map(array)
  new_array = []
  array.each do |item|
    yield(item)
    new_array << item
  end
end

new_map([1,2,3,4]) do |item|
  item + 1
end

new_map(["cat", "hat", "bat"]) do |item|
  item.capitalize
end

赋值:

 new_map should not call map or map!

RSpec::Expectations::ExpectationNotMetError

expected: [2, 3, 4]
     got: [1, 2, 3]

(compared using ==)

exercise_spec.rb:9:in `block (2 levels) in <top (required)>'

 new_map should map any object
RSpec::Expectations::ExpectationNotMetError

expected: [Fixnum, String, Symbol]
     got: [1, "two", :three]

(compared using ==)

exercise_spec.rb:14:in `block (2 levels) in <top (required)>'

规格:

describe "new_map" do
  it "should not call map or map!" do
    a = [1, 2, 3]
    a.stub(:map) { '' }
    a.stub(:map!) { '' }

    expect( new_map(a) { |i| i + 1 } ).to eq([2, 3, 4])
  end

  it "should map any object" do
    a = [1, "two", :three]
    expect( new_map(a) { |i| i.class } ).to eq([Fixnum, String, Symbol])
  end
end

1 个答案:

答案 0 :(得分:1)

def new_map(array)
  new_array = []
  array.each do |item|
    yield(item)
    new_array << yield(item)
  end
  new_array
end

new_map([1,2,3,4]) do |item|
  item + 1
end

new_map(["cat", "hat", "bat"]) do |item|
  item.capitalize
end