我必须搜索数组中的项目并返回下一个项目的值。例如:Ruby:如何找到数组中的下一个匹配
a = ['abc.df','-f','test.h']
i = a.find_index{|x| x=~/-f/}
puts a[i+1]
除了使用索引之外,还有其他更好的方法吗?
我必须搜索数组中的项目并返回下一个项目的值。例如:Ruby:如何找到数组中的下一个匹配
a = ['abc.df','-f','test.h']
i = a.find_index{|x| x=~/-f/}
puts a[i+1]
除了使用索引之外,还有其他更好的方法吗?
一个经典的功能性方法不使用索引(xs.each_cons(2)
- XS的>成对组合):
xs = ['abc.df', '-f', 'test.h']
(xs.each_cons(2).detect { |x, y| x =~ /-f/ } || []).last
#=> "test.h"
使用Enumerable#map_detect简化它更豆蔻位:
xs.each_cons(2).map_detect { |x, y| y if x =~ /-f/ }
#=> "test.h"
我不知道一个更清洁的方式来做那个特定的操作。然而,它肯定看起来像你试图解析命令行参数。如果是这样,我建议使用内置的OptionParser模块 - 它会节省大量的时间和头发拉动试图自己解析它们。
This article解释了它是如何工作的。
的原因类似的东西array.find{something}.next
不存在的是它是一个数组而不是一个链表。每个项目只是它自己的价值;它没有“我之后的项目”的概念。
@tokland通过在每一对连续项目上遍历数组提供了一个很好的解决方案,这样当第一个项目匹配时,您可以方便地使用第二个项目。可以肯定的是,对功能风格有很强的争议。尽管如此,你的版本更短,而且我认为你的浏览速度更快,更容易理解。
如果问题是,你使用它了很多,想要的东西更清洁,更重要的是,那么你当然可以只将其添加为一个单独的方法来a
:
def a.find_after(&test)
self[find_index(&test).next]
end
然后
a.find_after{|x| x=~/-f/}
是找到第一个匹配后的下一个项目的明确方法。
所有这一切都说,我认为@BenjaminCox对看起来是你的实际目标提出了最好的观点。如果你解析命令行选项,那么有很好的库。
太好了!谢谢! – texasbruce
@CarySwoveland谢谢! –
与索引一起工作的解决方案很好,正如其他人所评论的。你可以使用Enumerable#drop_while
从你的匹配中获得一个数组,并采取第二个元素:
a = ['abc.df','-f','test.h']
f_arg = a.drop_while { |e| e !~ /-f/ }[1]
你为什么不喜欢这个? –
您的解决方案没有任何问题。这真的很好想和干净。你为什么要改变它? – YuriAlbuquerque
我正在考虑像'array.find {something} .next'之类的东西,但不知道这些。我不喜欢的是使用索引。 – texasbruce