簡體   English   中英

Ruby高效各回路

[英]Ruby efficient each loop

有沒有更好的方法來寫這個? 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 << "------------------------------------\n\n"
end

你可以:

  • 使用puts而不是<<來避免顯式換行
  • 使用center將標題水平居中
  • 使用map生成屬性字符串並利用puts ' 在單獨的行上打印數組元素的行為
  • 使用without獲得沒有:Module密鑰的 hash
  • 使用*重復一個字符串

應用於您的代碼:

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

Output 通過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 語法。 您可能希望將 output 更改為以下內容:

### 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:

# Define your hashes with keys having consistent case, and omit extraneous
# surrounding quotes unless defining keys like "this-name" which are not
# valid without escaping.
coverage = [
  {
    module: "Mobile",
    name: "Sheila Chapman",
    age: 21
  },
  {
    module: "Web",
    name: "Hendricks Walton",
    age: 40
  },
  {
    module: "Misc",
    name: "Torres Mcdonald",
    age: 39
  }
]

# Iterate over each of these elements...
coverage.each do |entry|
  markdown << "------- Status on #{entry[:module]} -------\n"

  entry.each do |key, value|
    # Skip a particular key
    next if (key == :module)

    markdown << "- #{key}: #{value} \n"
  end

  markdown << "----------------------------------------------\n"
end

這可以調整為具有要排除的鍵列表,或者相反,具有要實際打印的鍵列表。

你的方法確實沒有什么問題。 主要的失誤是在數據上使用delete ,這會破壞它,如果你需要再次打印它,它就會變得無用。

通常最好盡量避免篡改您正在迭代的數據,除非該代碼的目的是明確的改變它的意圖。

看起來您的輸入數據始終具有相同的鍵/值對,我會更明確地使其更易於閱讀並理解實際的 output 是什么:

coverage_hash_arr.each do |hash|
  markdown << <<~STRING
    ------- Status on #{hash[:Module]} -------
    - name: #{hash[:name]}
    - age:  #{hash[:age]}
    ----------------------------------------------
  STRING
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM