当符号是散列中的键时,如何将带有下划线(例如 The_Dark_Knight)的符号转换为单词之间有空格的字符串?

How do I turn a symbol , that has underscores (e.g. The_Dark_Knight), when the symbol is a key in a hash into a string with spaces in between words?

我是编码的新手,只做了大约 12 天,所以请原谅我的 n00biness。我决定先学习 Ruby,因为它不是特别难掌握。我正在制作一个跟踪和存储用户信息的小程序。在代码的这个特定部分中,我想跟踪和存储用户如何评价特定电影。我一直在尝试一些功能,例如添加、显示、删除和更新电影(这四个元素是 "whens" 作为 case 语句的一部分)。我在显示部分遇到了障碍。

我一直用来测试程序的散列是(免责声明:电影评级无意冒犯):

movies = {
  The_Dark_Knight: 10,
  Justice_League: 1,
  Wolverine_Origins: 7,
  Wonder_Woman: 6,
  Man_of_Steel: 8 
}

我希望 Ruby 在散列中显示电影的标题(在遍历它们之后)以及评分:


=begin 
The Dark Knight: 10
Justice League: 1
Wolverine Origins: 7 
Wonder Woman: 6
Man of Steel: 8 
=end 

这是case语句的显示部分。 'When' 用户选择显示它应该向他们显示电影的标题和评分,如上所示。

when "display"

movies.each {|title, rating|

title_as_string = title.to_s.split('_').map(&:capitalize).join(' ')

puts "#{title_as_string}: #{rating}"
} 

这就是我处理它的方式,当我告诉你我花了很长时间才弄明白时请相信我。它得到了我想要的结果但是...

...问题是:是否有更简洁或更好的方法来做到这一点?如果可以,怎么做?

非常感谢您的回答。

有很多方法可以做同样的事情。

  1. 您可以使用 String#gsub - 这代表 "global substitution" 这正是您想要做的 - 用 _ 代替 space:

      title_as_string = title.to_s.gsub("_", " ")
    

    您也可以使用 String#tr - 该方法不做完全相同的事情,但在这种情况下,您可以将 gsub 替换为 tr,它会得到相同的结果

  2. 使用字符串作为键。写出来并不容易,因为您需要使用 hashrocket (=>) 语法,但不需要替换:

      movies = {
        "The Dark Knight" => 10,
        "Justice League" => 1,
        # etc
      }
    
  3. 将 spaces 放入您的符号中 - 这种方法并不常用,但它是完全有效的语法:

      movies = {
        "The Dark Knight": 10,
        "Justice League": 1,
        # etc
      }
    

    唯一的 这个键和字符串键之间的一个区别是我用冒号 : 替换了 hashrocket =>。在这种情况下您仍然需要调用 .to_s 但不需要进行替换。 正如 engineersmnky 在评论中指出的那样,还有其他差异......我可能不会建议这种方法,因为它不是很常见

  4. 使用 "data object" 模式。这有点冗长但也更明确:

      movies = {
        The_Dark_Knight: {
          name: "The Dark Knight",
          rating: 10
        },
        Justice_League: {
          name: "Justice League",
          rating: 1
        }
      }
    
      movies.each {|key, data|
        title_as_string = data[:name]
        rating = data[:rating]
        # etc
      }
    

    这可能看起来多余,但实际上更灵活 - 如果您将这些电影存储在数据库中并希望使用 ID 作为散列的键怎么办?这样您就可以根据 ID 快速查找记录。

另一件事,您应该对多行块使用 do ... end。仅对 oneliner 块使用大括号。