当符号是散列中的键时,如何将带有下划线(例如 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}"
}
这就是我处理它的方式,当我告诉你我花了很长时间才弄明白时请相信我。它得到了我想要的结果但是...
...问题是:是否有更简洁或更好的方法来做到这一点?如果可以,怎么做?
非常感谢您的回答。
有很多方法可以做同样的事情。
您可以使用 String#gsub
- 这代表 "global substitution" 这正是您想要做的 - 用 _
代替 space:
title_as_string = title.to_s.gsub("_", " ")
您也可以使用 String#tr
- 该方法不做完全相同的事情,但在这种情况下,您可以将 gsub
替换为 tr
,它会得到相同的结果
使用字符串作为键。写出来并不容易,因为您需要使用 hashrocket (=>
) 语法,但不需要替换:
movies = {
"The Dark Knight" => 10,
"Justice League" => 1,
# etc
}
将 spaces 放入您的符号中 - 这种方法并不常用,但它是完全有效的语法:
movies = {
"The Dark Knight": 10,
"Justice League": 1,
# etc
}
唯一的 这个键和字符串键之间的一个区别是我用冒号 :
替换了 hashrocket =>
。在这种情况下您仍然需要调用 .to_s
但不需要进行替换。 正如 engineersmnky 在评论中指出的那样,还有其他差异......我可能不会建议这种方法,因为它不是很常见
使用 "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 块使用大括号。
我是编码的新手,只做了大约 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}"
}
这就是我处理它的方式,当我告诉你我花了很长时间才弄明白时请相信我。它得到了我想要的结果但是...
...问题是:是否有更简洁或更好的方法来做到这一点?如果可以,怎么做?
非常感谢您的回答。
有很多方法可以做同样的事情。
您可以使用
String#gsub
- 这代表 "global substitution" 这正是您想要做的 - 用_
代替 space:title_as_string = title.to_s.gsub("_", " ")
您也可以使用
String#tr
- 该方法不做完全相同的事情,但在这种情况下,您可以将gsub
替换为tr
,它会得到相同的结果使用字符串作为键。写出来并不容易,因为您需要使用 hashrocket (
=>
) 语法,但不需要替换:movies = { "The Dark Knight" => 10, "Justice League" => 1, # etc }
将 spaces 放入您的符号中 - 这种方法并不常用,但它是完全有效的语法:
movies = { "The Dark Knight": 10, "Justice League": 1, # etc }
唯一的这个键和字符串键之间的一个区别是我用冒号:
替换了 hashrocket=>
。在这种情况下您仍然需要调用.to_s
但不需要进行替换。 正如 engineersmnky 在评论中指出的那样,还有其他差异......我可能不会建议这种方法,因为它不是很常见使用 "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 块使用大括号。