Ruby高效的每个循环

有没有更好的方法来写这个?markdown是一个 StringIO

coverage_hash_arr = [
        {
          "Module": "Mobile",
          "name": "Sheila Chapman",
          "age": 21
        },
        {
          "Module": "Web",
          "name": "Hendricks Walton",
          "age": 40
        },
        {
          "Module": "Misc",
          "name": "Torres Mcdonald",
          "age": 39
        }
    ]

coverage_hash_arr.each do |the_hash|
    markdown << "------- Status on #{the_hash[:Module]} -------n"
    the_hash.delete(:Module)
    the_hash.each {|key, value| markdown << "- #{key}: #{value} n"} 
    markdown << "----------------------------------------------n"
end

我试过了,它似乎有效,但我想知道是否有更好的方法(递归)?

coverage_hash_arr.collect do |the_hash|
    the_hash.each do |key,value|
        key == :Module ? markdown << "--------- Status for #{value} ----------n" : markdown << " - #{key}: #{value} n"
      end
      markdown << "------------------------------------nn"
end

回答

你可以:

  • 使用puts而不是<<避免显式换行
  • 用于center将标题水平居中
  • 用于map生成属性字符串并利用puts' 在单独的行上打印数组元素的行为
  • 用于without在没有:Module密钥的情况下获取散列
  • 用于*重复字符串

应用于您的代码:

markdown = StringIO.new

coverage_hash_arr.each do |hash|
  markdown.puts " Status on #{hash[:Module]} ".center(46, '-')
  markdown.puts hash.without(:Module).map { |k, v| "- #{k}: #{v}" }
  markdown.puts '-' * 46
  markdown.puts
end

输出通过puts markdown.string

-------------- Status on Mobile --------------
- name: Sheila Chapman
- age: 21
----------------------------------------------

--------------- Status on Web ----------------
- name: Hendricks Walton
- age: 40
----------------------------------------------

--------------- Status on Misc ---------------
- name: Torres Mcdonald
- age: 39
----------------------------------------------

请注意,以上不是正确的 Markdown 语法。您可能希望将输出更改为如下所示:

### Status on Mobile
- name: Sheila Chapman
- age: 21

### Status on Web
- name: Hendricks Walton
- age: 40

### Status on Misc
- name: Torres Mcdonald
- age: 39


以上是Ruby高效的每个循环的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>