簡體   English   中英

了解 Ruby 中的循環迭代

[英]Understanding loop iteration in Ruby

我編寫了這段代碼來確定方法中給定輸入中存在多少個 a:

def count_a(word)
  count = 0
  i = 0
  while i < word.length
    char = word[i]
    
    if char == "a" || char == "A"
        count += 1
    end 
    
    i += 1  
  end

  return count 
end

puts count_a("application")  # => 2
puts count_a("bike")         # => 0
puts count_a("Arthur")       # => 1
puts count_a("Aardvark")     # => 3

有人可以更好地解釋為什么我需要方法底部的i += 1嗎? 我已經在上面的條件中添加了計數,所以我只需要進一步了解迭代如何在條件之外和方法內變得必要。

謝謝!

如果沒有 i += 1,代碼將無法運行

這是一個不錯的第一次嘗試。 但它並不是真正的 Ruby。

Ruby 實際上有很多方法可以讓你在不改變外部變量的情況下完成這個:

def count_a(word)
  word.each_char # enumerate over the chars
      .count { |l| ['a', 'A'].include?(l) } # counts the number of elements yielding a true value.
end

通常,當您處理輸入或流時,應該主要使用whileuntilloop等一般方法 - 換句話說,當您不在已知長度的 object 上循環時。 對於其他一切,請使用Enumerable和其他核心類提供的大量方法。

有人可以更好地解釋為什么我需要方法底部的 i += 1 嗎?

因為否則循環將永遠運行,因為i < word.length將始終為真。 但根據經驗,如果你曾經在 Ruby 中寫過i += 1 ,那你就錯了。

i += 1行將 1 添加到i 如果你刪除它,那么i將永遠停留在 0,因為你永遠不會改變它。 因此,您的循環將永遠不會終止(在word.length為正的情況下)。

任何循環都需要測試和更新。 如果測試中的變量永遠不會改變,為什么循環會永遠結束?

這個方法可以寫得更加地道,如下所示。 通過首先將字符串小寫,我們不必檢查'a''A'

def count_a(word)
  word.downcase.count('a') 
end

作為一種中間解決方案,您可以使用#each_char遍歷字符串中的每個字符。

def count_a(word)
  count = 0
  word.each_char do |ch|
    count += 1 if ch == 'a' || ch == 'A'
  end
  count

請注意,方法返回其最后一個表達式,僅需要顯式return來中斷控制流並提前從方法返回。

暫無
暫無

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

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