簡體   English   中英

迭代Ruby數組的最慣用的方法,當滿足任意條件時退出?

[英]The most idiomatic way to iterate through a Ruby array, exiting when an arbitrary condition met?

我想迭代一個數組,其中每個元素都是兩個整數的數組(例如`[3,5]'); 對於這些元素中的每一個,我想計算兩個整數的和,當這些和中的任何一個超過某個任意值時退出循環。 源數組非常大,我可能會在開頭附近找到所需的值,因此循環遍歷所有不需要的元素不是一個好選擇。

我寫了三個循環來完成這個,所有這些都產生了預期的結果。 我的問題是:哪個是更慣用的Ruby? 或者 - 更好 - 是否有更好的方法? 我盡量不使用非本地循環變量,但是break語句看起來像我的(不可否認的新手)眼睛。

# Loop A
pairs.each do |pair|
  pair_sum = pair.inject(:+) 
  arr1 << pair_sum
  break if pair_sum > arr2.max
end

#Loop B - (just A condensed)
pairs.each { |pair| arr1.last <= arr2.max ? arr1 << pair.inject(:+) : break }

#Loop C
i = 0
pair_sum = 0
begin
  pair_sum = pairs[i].inject(:+)
  arr1 << pair_sum
  i += 1
end until pair_sum > arr2.max

類似的問題被要求在Ruby中早期逃離。每個{}循環 ,但反應基本上是,同時使用.each.each_with_index與退出break當目標指數達到了一定的作用, .take(num_elements).each都更具慣用性。 然而,在我的情況下,我事先並不知道有多少元素需要迭代,向我展示看似邊界的情況。

這是我已經解決的項目歐拉式問題,順便說一句。 只是想知道社區首選的語法。 提前感謝您寶貴的時間。

takedrop有一個變量take_whiledrop_while ,而不是提供一個固定數量的元素,你提供一個塊。 只要塊返回true,Ruby就會從接收器中累積值(在take_while的情況下)。 您的代碼可以重寫為

array.take_while {|pair| pair.sum < foo}.map(&:sum)

這意味着您需要兩次計算其中一些對的總和。

在Ruby 2.0中有Enumerable#lazy ,它返回一個惰性枚舉器:

sums = pairs.lazy.map { |a, b| a + b }.take_while { |pair_sum| pair_sum < some_max_value }.force

這避免了兩次計算總和。

[[1, 2], [3, 4], [5, 6]].find{|x, y| x + y > 6}
# => [3, 4]
[[1, 2], [3, 4], [5, 6]].find{|x, y| x + y > 6}.inject(:+)
#=> 7

暫無
暫無

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

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