2016-03-16 206 views
1

我想大寫字符串中每個單詞的第二個字母。例如,如果字符串是「你好嗎」,它應該返回[0,R,0],但是我得到['nil','nil','nil']。爲什麼我會得到零?有什麼我做錯了嗎?調試紅寶石算法

def capitalize(string) 
    words = string.split(" ") 
    index = 0 
    words.each do|word| 
    break if index == words.length 
    p word[index][1].inspect 
    index += 1 
    end 
end 

capitalize("how are you") 
+0

只是另一種可能令你感興趣的方式'string =「你好嗎」 然後'string.split.map.with_index {| s,i |我%2!= 0? s [1] .capitalize:s = 0}' –

回答

3

讓我們來看看這裏發生了什麼:

index = 0 
words.each do |word| 
    break if index == words.length 
    p word[index][1].inspect 
    index += 1 
end 

在第一次迭代,word"how"index將是0,所以你在做p word[0][1].inspect"how"[0]"h","h"[1]nil(因爲字符串"h"只有一個字符)。

在第二迭代中,word"are"index是1 "are"[1]"r""r"[1]是,再次,nil

依此類推。在每次迭代中,您將從word中獲取單個字符,然後嘗試獲取該字符串的第二個字符,該字符總是nil

我懷疑這是你試圖做:

index = 0 
loop do 
    break if index == words.length 
    p words[index][1] 
    index += 1 
end 

看到區別?它打印words[index][1],而不是word[index][1],並一直保持循環,直到index == words.length爲真。

但是,由於Ruby有Enumerable#each,因此您可以讓它爲您執行遍歷words的工作,而您完全不必擔心index。這是你想要的:

words.each do |word| 
    p word[1] 
end 

P.S.你會注意到我使用了p word[1],而不是p word[1].inspect。方法p將自動在其每個參數上調用inspect。如果你做p word[1].inspect,你基本上在做puts word[1].inspect.inspect

+0

謝謝你的幫助!現在明白了。 –

+0

很高興幫助!隨時接受我的答案,如果它解決了你的問題。 –

+1

...但不急於選擇答案,OP不希望阻止其他答案或將仍在解答的答案短路。很多人至少要等上幾個小時。 –

0

一個非常簡單和乾淨的解決方案是這樣的

def capitalize(string) 
    words = string.split(" ") 
    words.each_with_index.map do |word, index| 
    if index % 2 == 0 
     0 
    else 
     word[1].swapcase 
    end 
    end 
end 

capitalize("how are you") 

你可以嘗試一下這裏https://repl.it/Bwyk/2

+0

抱歉,錯字不是0,返回應該是[O,R,O],換成'Letter'O's –

2

@Jordan已經做了很好的工作經歷你的代碼和解釋的問題。

一種選擇是使用正則表達式:

R =/
    (?<=  # begin a positive lookbehind 
     \b  # match a word break 
     [a-z] # match a lower-case letter 
    )  # end positive lookbehind 
    [a-z] # match a lower-case letter 
    /ix  # case-insensitive (i) and free-spacing regex definition (x) modes 

def capitalize(str) 
    str.gsub(R) { |c| c.upcase } 
end 

capitalize("how are you") 
    #=> "hOw aRe yOu" 

你當然可以寫的:

def capitalize(str) 
    str.gsub(/(?<=\b[a-z])[a-z]/i) { |c| c.upcase } 
end 

寫正則表達式的另一種方法是:

R =/
    \b # match a word break 
    [a-z] # match a lower-case letter 
    \K # forget everything matched so far 
    [a-z] # match a lower-case letter 
    /ix # case-insensitive (i) and free-spacing regex definition (x) modes 
+0

Aaaa!正則表達式很棘手!:)喜歡它 – fl00r

1

一在這裏應該介紹一下:) :)

"how are you".split(" ").map{ |w| w[1].capitalize } 
=> ["O", "R", "O"]