【问题标题】:Ruby: how to use gsub method on symbol inside string interpolation #{}Ruby:如何在字符串插值内的符号上使用 gsub 方法 #{}
【发布时间】:2015-02-07 19:35:53
【问题描述】:

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

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

【问题讨论】:

    标签: ruby symbols gsub string-interpolation


    【解决方案1】:

    你完全拥有它。该散列中的键是一个符号 (:new_years)。您必须首先:

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

    【讨论】:

      【解决方案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之前手动字符串化。

      【讨论】:

      • 啊,明白了。我没有意识到首先评估了 整个表达式。现在完全有道理。感谢您的澄清!
      猜你喜欢
      • 2013-08-14
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多