Ruby:如何在字符串插值内的符号上使用gsub方法#{}

时间:2015-02-07 19:35:54

标签: ruby symbols gsub string-interpolation

我正在尝试迭代哈希,在格式化列表中打印出键和值。我的理解是字符串插值#{}会隐式地将符号转换为字符串。但是,当我运行下面的代码(稍微缩写)时:

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

2 个答案:

答案 0 :(得分:4)

你完全拥有它。该哈希中的关键是符号(:new_years)。你必须先:

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

答案 1 :(得分:2)

确实,在字符串插值中,单个符号将被字符串化。

>> 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之前,您必须手动进行字符串化。