jdb*_*rns 4 ruby arrays each loops break
我想迭代一个数组,其中每个元素都是两个整数的数组(例如`[3,5]'); 对于这些元素中的每一个,我想计算两个整数的和,当这些和中的任何一个超过某个任意值时退出循环.源数组非常大,我可能会在开头附近找到所需的值,因此循环遍历所有不需要的元素不是一个好选择.
我写了三个循环来完成这个,所有这些都产生了预期的结果.我的问题是:哪个是更惯用的Ruby?或者 - 更好 - 是否有更好的方法?我尽量不使用非局部循环变量,但是break对于我的(不可否认的新手)眼睛来说,语句看起来有点像hackish.
# 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
Run Code Online (Sandbox Code Playgroud)
有一个类似的问题是在Ruby早期逃避.each {}迭代时被问到的,但是响应本质上是这样的,当使用.each或.each_with_index退出break目标索引时,.take(num_elements).each它会更有用.然而,在我的情况下,我事先并不知道有多少元素需要迭代,向我展示看似边界的情况.
这是我已经解决的项目欧拉式问题,顺便说一句.只是想知道社区首选的语法.提前感谢您宝贵的时间.
take和drop具有一个变体take_while并且drop_while其中,代替提供元素的固定数量的你提供的块.只要块返回true,Ruby就会从接收器中累积值(在take_while的情况下).您的代码可以重写为
array.take_while {|pair| pair.sum < foo}.map(&:sum)
Run Code Online (Sandbox Code Playgroud)
这意味着您需要两次计算其中一些对的总和.