2015-02-07 34 views
1

我正在嘗試遍歷散列,打印出格式化列表中的鍵和值。我的理解是字符串插值#{}會隱式地將符號轉換爲字符串。然而,當我運行下面的代碼(略有刪節):Ruby:如何在字符串插值符號內使用gsub方法#{}

holiday_hash = { 
    :winter => {:new_years => ["Party Hats", "Champagne"]} 
} 
holiday_hash.each do |key,value| 
    value.each do |key, value| 
    puts "#{key.gsub("_", " ")}: #{value.join(', ')}" 
    end 
end 

我收到此錯誤信息:

NoMethodError: undefined method `gsub' for :new_years:Symbol 

有人能解釋這個問題?在運行.gsub之前,我需要將鍵明確轉換爲字符串嗎? (即使用'key.to_str.gsub ...')。當然,清潔代碼解決方案也非常受歡迎。我意識到我需要大量的重構。

而且我的預期/所需的輸出如下:

New Years: Party Hats, Champagne 

回答

1

這是真的,串插內,一個符號將字符串化。

>> s = :hello 
=> :hello 
>> "#{s}" 
=> "hello" 

但是你要記住,整個表達式括號內評估其字符串化之前。這就是爲什麼你看到:

>> "#{s.gsub('u','e')}" 
NoMethodError: undefined method `gsub' for :hello:Symbol 
    from (irb):3 
    from /usr/local/bin/irb:11:in `<main>' 

所以你必須手動串行應用gsub之前。

+0

啊,明白了。我沒有意識到首先評估_entire expression_。現在做出總體感覺。謝謝澄清! – ktravers 2015-02-08 00:10:38

3

你弄到手。該散列中的關鍵字是一個符號(:new_years)。你必須首先:

puts "#{key.to_s.gsub("_", " ")}: #{value.join(', ')}" 
+0

全部清除 - 感謝您的快速幫助! – ktravers 2015-02-08 00:12:00