2015-02-06 31 views
0

我想寫一個方法,大寫字母中的每個單詞的第一個字母。爲什麼加入不會在這個每個語句

def capitalize(string) 
    arr1 = string.split(" ") 
    arr2 = [] 
    arr1.each do |i| 
    arr2 << i.split(//) 
    end 
    arr2.each do |i| 
    i[0].upcase! 
    i = i.join 
    end 
    arr2.join(" ") 
end 

在我的第二個each聲明,每個單詞的第一個字母是成功的資本,我得到這樣的:

[["A", "a", "a"], ["A", "a", "a", "a"]] 

我想加入的每個單詞在一起,但i = i.join什麼也不做i.join!拋出一個錯誤,未定義的方法。我測試了["A", "a", "a"].join,這產生了期望的結果。我很困惑,爲什麼這不適用於我的方法,特別是當upcase工作,這不。

你能解釋一下我在這種情況下的思維錯誤以及如何解決它?

回答

3

這裏的關鍵是你試圖在each塊內部修改i,但是i是一個局部變量,它對原始文件沒有影響。

你想要的是:

arr2.collect! do |i| 
    i[0].upcase! 
    i.join 
end 

這重寫數組的內容。

你能做什麼,不過,是卷本成一個簡單的gsub

def capitalize(string) 
    string.gsub(/\b([a-z])\B/) do |m| 
    $1.upcase 
    end 
end 
+0

唉唉,我得到它。謝謝! – key 2015-02-06 00:52:15

0

我相信在這個代碼在這裏:

arr1.each do |i| 
    arr2 << i.split(//) 
end 

您是從分割每個單詞的每個字符第一個數組。這基本上會給你一個數組的數組。如果你把這個區塊在你的第二個循環後,可以看到結構:

arr2.each do |i| 
    puts("[") 
     i.each do |x| 
      puts(x) 
     end 
     puts("]") 
end 

有關解決方案,可以做一些事情,像這樣:

def self.capitalizeB(string) 
    return string.split(" ").each { |i| i[0] = i[0].upcase }.join(" ") 
end 
相關問題