Я новичок в рубине и просматриваю учебник, посвященный блокам и урокам, и особенно демонстрирую Monkey Patching.Блоки и выходы по устранению неполадок в рубине
Вот требование кода вызова
Написать новый метод new_map, который вызывается на экземпляре класса Array. Он должен использовать> массив, который он вызывается как неявный (сам) аргумент, но в противном случае ведет себя одинаково.
Вот код, который я представил
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)>'
Из спецификации, a m I предположить, что метод .map
не должен использоваться в этой конкретной проблеме?
Я даже попробовал это с этим допущением. Но он не прошел ни одного из спецификаций.
def new_map(array)
new_array =[]
array.each do |i|
new_array << yield(i)
end
new_array
end
Update
Я вошел в этот код и он работал
def new_map
new_array = []
self.each do |i|
new_array << yield(i)
end
new_array
end
Но я надеялся, что кто-то может помочь мне понять, почему я должен был удалить аргумент (array)
и, следовательно, изменить array.each
к self.each
?
Пожалуйста, обратите внимание на правильность маркировки, если она решила вашу проблему. –