2014-02-09 1 views
0

루비 코스의 숙제 문제를 해결하기 위해 노력하고 있습니다. 나는 몇 가지 코드를 함께 의아해Ruby : 문자열을 뒤집어 쓰는 Proc

describe "reverser" do 
it "reverses the string returned by the default block" do 
    result = reverser do 
    "hello" 
    end 
    result.should == "olleh" 
end 

it "reverses each word in the string returned by the default block" do 
    result = reverser do 
    "hello dolly" 
    end 
    result.should == "olleh yllod" 
end 
end 

나는 이러한 조건을 만족한다고 생각 : 기본적으로 나는이 조건을 만족시킬 수있는 프로그램을 구축 할 필요가 내가 레이크를 실행할 때 그러나

reverser = Proc.new do |string| 

words = string.split(/\b/) 

answer = '' 

i = 0 
while i < words.count 
    answer = answer + words[i].reverse 
    i += 1 
end 
answer 
end 


def reverser 
yield 

end 

을 내 오류가 말한다 나 첫번째 조건에 실패했다.

expected: "olleh" 
got: "hello" 

내가 빠진 것이 있나요? 나는 프록을 제대로 이해하지 못했습니까?

이 질문은 pete라는 회원이 어떤 형태로든 질문을하고 mind.blank라는 다른 사용자가 아주 잘 답변 해주었습니다. 출처 :

Beginner RSpec: Need help writing Ruby code to pass RSpec tests (Silly Blocks exercise).

mind.blank의 코드는 간단하고 올바르게 작동했지만, 왜 광산이 작동하지 않는지 이해하지 않고 복사하고 싶지는 않습니다. 모든 도움을 미리 감사드립니다.

답변

1

그래서 - 당신은 "리버"라는 이름의 지역 변수와

귀하의 코드는 결코 실행되지 않습니다 ("그림자"리버 지역에 것입니다) "리버"라는 메서드가 뭘 찾았는지.

그래서 - 당신이 원하는 것은 ... 수확 결과를 가져 와서 그 반대의 작업을하는 것입니다. (제쳐두면 요구 사항은 잠시 동안 얼마나 기괴한입니다.)

def reverser 
    string = yield 
    # ... all of your reverser code ... 
end 

지금 다시 주위를 돌고 - 그 블록을 사용하는 기괴한 방법입니다. 블록은 메소드에 인수를 전달하는 것이 아니라 메소드에 추가 실행을 전달하기위한 것입니다. 따라서 역순으로 각 문자에 대해 콜백을 실행하도록하면 (역순으로) 올바른 결과를 얻을 수 있습니다.

게다가 Ruby에는 이미 String#reverse 메서드가 있습니다. 따라서 테스트를 통과하는 가장 쉬운 방법은 다음과 같습니다. 당신은 당신이 예상 'cba' 다시 얻을 것이다 reverser.call('abc') (또는 reverser['abc'] 또는 reverser.('abc'))을 말한다면

def reverser 
    (yield).split(/\b/).map(&:reverse).join 
end 
+0

지속 같은 방법으로 주어진 문자열을 반전 할 것이다. 네가 옳아. – prater

+0

팁 주셔서 감사. 그 대답은 다른 스레드의 남자가 게시 한 것입니다. 이유를 모른 채 코드를 훔치기를 원하지 않았습니다. 그러나 나는 그것을 조금 더 이해하고있다. – zethsaber

1

귀하의 reverser 시저는 작업을 수행합니다.

문제는 귀하의 reverser proc을 사용하고 있지 않으며 귀하의 reverser 방법을 사용하고 있다는 것입니다. 이 블록과 reverser 메소드의 호출입니다 :

def reverser 
    yield 
end 

그래서 result이되는 끝 :

result = reverser do 
    "hello" 
end 

하지만 흥미로운 아무것도하지 않는 reverser 방법, 그냥 블록에 산출 블록의 값은 'hello'입니다.

중 하나 PROC 테스트 :

it "reverses the string returned by the default block" do 
    result = reverser['hello'] 
    result.should == "olleh" 
end 

을하거나 reverser 방법에 시저의 용기를 이동하고 테스트하는 것이 :

def reverser 
    string = yield 
    words = string.split(/\b/) 
    answer = '' 

    i = 0 
    while i < words.count 
    answer = answer + words[i].reverse 
    i += 1 
    end 
    answer 
end 

더 나은 코드를 작성하는 방법 (예 : words.map(&:reverse).join 대신이있다 while 모양)하지만 역 논리가 작동하면 올바른 버전의 전화를해야합니다.

+0

고마워. 그래서 rspec에 대한 저의 이해는 조금 어둡습니다. 나는 그것에 좌절감을 느끼고 있었지만 당신의 설명은 많이 정리되었습니다. 나는 너희들을 업신이게 할 것이지만 나는이 사이트에 처음 온 사람들이다 : D. 다시 한 번 감사드립니다. – zethsaber

+1

걱정할 필요가 없습니다. 맹목적으로 다른 사람의 코드에 걸려 넘어지기보다는 무슨 일이 벌어지고 있는지 이해하기를 원하는 사람들에게는 좋은 태도입니다. –

0

이 코드 블록

def reverser 
    # yield is the string given in the block 
    words = yield.split(' ') 
    final = [] 
    words.each do |word| 
     final.push(word.reverse) 
    end 
    final.join(' ') 
end 
관련 문제