【问题标题】:Ruby: iterating over a hash and formatting the displayRuby:遍历哈希并格式化显示
【发布时间】:2015-06-02 12:15:16
【问题描述】:

假设我有一个这样的哈希:

top_billed = { ghostbusters: 'Bill Murray', star_wars: 'Harrison Ford' }

以一种易于阅读的方式对其进行格式化的最佳方式是什么? 例如,如果您在散列上调用了一个方法,它会将散列显示为大写列表,减去下划线。

  • “捉鬼敢死队:比尔默里”
  • 星球大战:哈里森福特

我猜想遍历数组并使用 gsub 删除下划线然后大写可能会起作用,但我想知道是否有更优雅的方法。

谢谢

【问题讨论】:

  • “减号下划线”是什么意思?
  • 如果你去掉:star_wars的下划线,你会得到:starwars
  • Ghostbusters开头有双引号的逻辑是什么?
  • 减下划线也就是没有下划线。我希望他们用空格代替。请忽略双引号;这是一个错字。

标签: ruby hash format iteration


【解决方案1】:

手动:

top_billed.each do |k, v|
  puts k.to_s.gsub("_", " ") + ": " + v
end

如果您使用的是 Rails 或 ActiveSupport,您还可以使用“humanize”方法(在字符串上)。

【讨论】:

  • 可能是一个单独的问题,但是当它在 irb 中执行时,为什么会按预期显示,但 irb 将最终输出显示为原始哈希?
  • irb 显示输出(因此是“puts”的结果)和输入的每条指令的结果 - 这对于调试很方便,这就是 irb 的全部意义所在。
【解决方案2】:

这是一个递归解决方案:

top_billed = { ghostbusters: { my_name: 'Bill Murray', my_age: 29 }, star_wars: { my_name: 'Harrison Ford' }, something_esle: 'Its Name'}

def print_well(key, value, indent)
  key = key.to_s.split('_').map(&:capitalize).join(' ')
  if Hash === value
    puts "#{key}: "
    value.each do |k, v|
      print_well k, v, indent + 1
    end
  else
    puts "#{' '*indent}#{key}: #{value}"
  end
end

def print_hash hash, indent=0
  hash.each do |key, value|
    print_well key, value, indent
  end
end

print_hash top_billed

【讨论】:

  • 我开始使用 gems,但作为学习语言基础的人,了解事情的实际运作方式会很有帮助。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
相关资源
最近更新 更多