我刚刚在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
答案 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