[英]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
通常,當您處理輸入或流時,應該主要使用while
、 until
和loop
等一般方法 - 換句話說,當您不在已知長度的 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.