2015-01-03 3 views
1

저는 루비 초보자이며 블록 및 수율을 다루는 튜토리얼을 살펴보고 특히 Monkey Patching을 시연합니다. 여기 루비 블록 및 수율 이해에 어려움이 있음

는 Array 클래스의 인스턴스에서 호출되는 새로운 new_map 방법을 쓰기 코드 문제의 요구 사항입니다. 암시 적 (자체) 인수로 호출 된 배열을 사용해야하지만 그렇지 않으면 동일하게 작동합니다. 여기

내가 여기
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?

답변

0

하지만 내가 self.each하는 array.each 변경 따라서 인수 (배열)을 제거했다 왜 누군가가 나를 이해하는 데 도움이 수 바라고 있었다?

  1. 배경 : 첫 번째 방법은 실제로 배열로 전달 될 필요가 없습니다 인수를 찾고 있었다 발신자 자체; 즉, 호출자 (또는 self)를 인수로 인수로 전달하려고합니다. 기술적으로는 그렇게 할 수 있지만 필수는 아닙니다.
  2. 오류의 이유 : 그러나 이전 정의에서 사양을 실행하는 중에 오류가 발생하는 경우 해당 인수를 추가하여 메소드 정의가 변경 되었기 때문입니다.

    new_map 배열 {블록} 인수 배열이 실제로 전달되는 것은 아니지만

, 따라서 당신에게 ArgumentError을 제공 : 즉,이 같은 호출 방법 1이 이다.

+0

문제가 해결되면 올바른 표시를하십시오. –

0

new_map은이 [1,2,3] 배열 인스턴스 이는 어레이 클래스 자체가 배열 == 자기

[1,2,3].new_map(&:to_s) 

제조 인스턴스 방법

self.each do |i| 

[1,2,3].each do |i| 
1,2

후 각각 3과 같은 블록에 전달 될 수있다

,
new_array << yield(i) 
+0

new_map 메서드가 Array 클래스의 인스턴스이므로 (array) 인수를 전달하는 것이 중복 되는가? 참으로 예, – deventhusiast

+0

. 그리고 통과해야하는 스펙을 살펴보면 블록을 통과해야합니다. –