2013-04-17 36 views
0

我試圖建立一種方法,你把每個單詞的第一個字母,並將其大寫。我寫它爲紅寶石正則表達式掃描與分割方法

def titleize(name) 
    name.scan(/\w+/) { |x| x.capitalize! } 
end 

它只是不會正常工作。它不會大寫和字母。我做了一些搜索,最終在這裏找到了答案Capitalizing titles。它被寫爲

def titleize(name) 
    name.split(" ").each { |x| x.capitalize! }.join(" ") 
end 

我的代碼怎麼沒有大寫,雖然?如果我增加了一個看跌語句,並寫了它作爲

def titleize(name) 
    name.scan(/\w+/) { |x| puts x.capitalize! } 
end 

這將輸出「你好」與首都但是=>仍只是「你好」我錯過了什麼?

+2

你的代碼輸出是什麼?你有什麼投入?你怎麼稱呼你的方法? –

+0

@squiguy'#upcase'與'capitalize'不一樣# – Agis

+0

我會輸入「jaws」,它會返回給我1) Simon說titleize大寫字 失敗/錯誤:titleize(「jaws」)。應該==「大白鯊」 預計:「大白鯊」 得到:「下巴」(使用==) 它運行通過rspec耙。我正在通過一個教程。 –

回答

2

更正代碼:

def titleize(name) 
    name.scan(/\w+/).each { |x| x.capitalize! }.join(' ') 
end 

p titleize("ayan roy") #=>"Ayan Roy" 

讓我們來看看爲什麼你的一個不工作:

def titleize(name) 
    name.scan(/\w+/) 
end 

p titleize("ayan roy") #=>["ayan", "roy"] 

現在您的線路name.scan(/\w+/) { |x| x.capitalize! }x"ayan", "roy"傳遞。現在看看下面的:

def titleize(name) 
    name.scan(/\w+/) { |x| p x.capitalize! } 
end 

p titleize("ayan roy") 

輸出:

"Ayan" 
"Roy" 
"ayan roy" 

由於String#scan說:

scan(pattern) {|match, ...| block } → str - if block is given,scan will return the receiver on which it is called. Both forms iterate through str, matching the pattern (which may be a Regexp or a String). For each match, a result is generated and either added to the result array or passed to the block.

+0

頂部的正確代碼是否將數組中的輸入視爲數組? –

+0

@MikeF yes you are right.'name.scan(/ \ w + /)'給出數組。 –

1

您的代碼不起作用,因爲#scan返回新的String對象,它們是正則表達式的結果並將它們傳遞給該塊。所以在你的方法中,你基本上把這些新的對象,通過調用#capitalize!變異,但從未在任何地方使用它們。

你應該這樣做,而不是:

def titleize(name) 
    name.scan(/\w+/).each { |x| x.capitalize! }.join(' ') 
end 

但這似乎更可讀的對我說:

def titleize2(name) 
    name.split(' ').each { |w| w.capitalize! }.join(' ') 
end 

不過請注意這些方法不發生變異通過原始的參數。

0

scan的塊形式返回原始字符串,無論您在塊中做什麼。 (我認爲您可以通過直接引用來更改塊中的原始字符串,但不建議改變您正在迭代的內容)。而是,請執行split變化,但不是each,請執行collect其次join

name.split(" ").collect { |x| x.capitalize }.join(" ") 

這適用於包含數字和標點符號的標題,以及。

2

scan回報/收益率新的字符串,絕不會修改源字符串。也許你想要gsub

def titleize(name) 
    name.gsub(/\w+/) {|x| x.capitalize } 
end 

或者可能更好地使用從titleize gem可能更正確的實施。