2014-02-09 57 views
0

我工作的紅寶石過程中的一些作業中的問題,我已經遇到一些麻煩我的答案。基本上,我需要建立一個程序,能夠滿足這些條件:紅寶石: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" 

有什麼我失蹤了嗎?我只是沒有正確理解procs?

這個問題已經被問以某種形式已經被一個名爲成員皮特和回答得很好另一個用戶名爲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 

現在盤旋迴到我的身邊 - 這是使用塊一個奇怪的方式。一個塊用於將額外的執行傳遞給一個方法,而不是將參數傳遞給它。所以如果你想說的話,爲反向器中的每個字符執行回調(反向?),這將正確使用yield。

此外,紅寶石已經有一個String#reverse方法 - 這樣最簡單的可能的事情做的就是你的測試通過是一樣的東西。

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

DUR字符串。你是對的。 – prater

+0

感謝您的提示。這是來自其他線程的人發佈的答案。我只是不想在不知道原因的情況下竊取他的代碼。但我現在更瞭解它。 – zethsaber

1

reverser PROC做的工作,如果你說reverser.call('abc')(或reverser['abc']reverser.('abc')),那麼你會得到預期的'cba'回。

問題是,您的測試沒有使用您的reverser proc,它使用reverser方法。這是對reverser方法與塊的電話:

result = reverser do 
    "hello" 
end 

reverser方法沒有做什麼有趣的,它只是得到該塊:

def reverser 
    yield 
end 

所以result最終成爲了塊的價值,這是'hello'

無論是測試PROC:

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

或移動PROC的膽量到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的理解是那麼有點陰暗。我不得不承認我對此感到沮喪,但你的解釋清理了很多。我會upvote你們,但我是新來的網站: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