【发布时间】:2015-03-01 09:38:39
【问题描述】:
我是 ruby 的初学者,正在学习处理块和产量的教程,特别是演示 Monkey Patching。
这是代码挑战的要求
编写一个新的 new_map 方法,该方法在 Array 类的实例上调用。它应该使用>它被调用的数组作为隐式(self)参数,但在其他方面表现相同。
这是我提交的代码
class Array
def new_map(&block)
self.map(&block)
end
def new_select!(&block)
self.replace(self.select(&block))
end
end
这是我必须通过的规格
describe Array do
describe '#new_map' do
it "returns an array with updated values" do
array = [1,2,3,4]
expect( array.new_map(&:to_s) ).to eq( %w{1 2 3 4} )
expect( array.new_map{ |e| e + 2 } ).to eq( [3, 4, 5, 6] )
end
it "does not call #map" do
array = [1,2,3,4]
array.stub(:map) { '' }
expect( array.new_map(&:to_s) ).to eq( %w{1 2 3 4} )
end
it "does not change the original array" do
array = [1,2,3,4]
expect( array.new_map(&:to_s) ).to eq( %w{1 2 3 4} )
expect( array ).to eq([1,2,3,4])
end
end
我通过了第一个和最后一个测试,但无法通过第二个测试并收到此错误
expected: ["1", "2", "3", "4"]
got: ""
(compared using ==)
exercise_spec.rb:14:in `block (3 levels) in <top (required)>'
根据规范,我是否可以假设 .map 方法不应该用于这个特定的挑战?
我什至在这个假设下尝试了这个。但它没有通过任何规格。
def new_map(array)
new_array =[]
array.each do |i|
new_array << yield(i)
end
new_array
end
更新
我输入了这个代码,它起作用了
def new_map
new_array = []
self.each do |i|
new_array << yield(i)
end
new_array
end
但我希望有人能帮助我理解为什么我必须删除参数 (array) 并因此将 array.each 更改为 self.each?
【问题讨论】:
标签: ruby block yield monkeypatching