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