Ruby:如何在数组中找到下一个匹配项

我必须搜索数组中的项并返回下一项的值。 例:

a = ['abc.df','-f','test.h'] i = a.find_index{|x| x=~/-f/} puts a[i+1] 

除了使用索引之外还有更好的方法吗?

经典的函数方法不使用索引( xs.each_cons(2) – > xs.each_cons(2) 成对组合 ):

 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" 

array.find{something}.next这样的array.find{something}.next不存在的原因是它是一个数组而不是一个链表。 每个项目都是它自己的价值; 它没有“跟在我后面的物品”的概念。

@tokland通过使用每对连续项目迭代数组来提供一个很好的解决方案,这样当第一个项目匹配时,您可以方便地使用第二个项目。 对于function风格,有充分的理由可以肯定。 不过,你的版本较短,而且我认为你的版本也会更快速,更容易理解。

如果问题是你经常使用它并希望更清洁,更重要的话,那么你当然可以将它作为单例方法添加到:

 def a.find_after(&test) self[find_index(&test).next] end 

然后

 a.find_after{|x| x=~/-f/} 

是第一场比赛后找到下一个项目的明确方法。

所有这些都说,我认为@BenjaminCox最能说明你的实际目标。 如果您正在解析命令行选项,那么有些库可以很好地完成。

我不知道如何更清洁地进行特定操作。 但是,它确实看起来像是在尝试解析命令行参数。 如果是这样,我建议使用内置的OptionParser模块 – 它会节省大量的时间和拉毛试图自己解析它们。

本文解释了它的工作原理。

使用索引的解决方案很好,正如其他人评论的那样。 您可以使用Enumerable#drop_while从匹配中获取数组并获取其中的第二个元素:

 a = ['abc.df','-f','test.h'] f_arg = a.drop_while { |e| e !~ /-f/ }[1]