2015-02-07 91 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