ruby – 在数组中找到第一个返回true的元素并返回该块的返回值

我需要迭代一个数组并将一个提供的块应用于每个元素,并返回该块返回的第一个真值,这意味着我需要在获得真值后立即停止.

下面是我的代码.我是一个ruby新手,我不确定这个代码是否重新发明轮子.也许有一种库方法或方法可以做到这一点?或者这个代码可以简化?

RS = {
  :x => %w(\d+ a\d+ bb\d+ ccc\d+).map{|x| /^#{x}$/},
  :y => %w(\w+ 1\w+ 22\w+ 333\w+).map{|x| /^#{x}$/}
}.freeze

def find s, t
  r = RS[s]
  if r
    r.each do |p|
      m = p.match t
      return m if m
    end
    nil
  end
end

p find :x, 'bb12345'
最佳答案
希望仍然是实际的:这里有一个使用detect的解决方案,我可以详细说明输出,这样你就可以看到在返回命中之前评估了哪些表达式.

def find_match symbol, string , verbose = false, match = nil
  if verbose
    RS.detect{|x,v|x==symbol;v.detect{|re|puts re;match=string.match(/#{re}/)}}
  else
    RS.detect{|x,v|x==symbol;v.detect{|re|match=string.match(/#{re}/)}}
  end
  match
end

p find_match :x, 'bb12345'
p find_match :x, 'ee12345' , true #verbose output
p find_match :x, '12345'
p find_match :y, '22abcd'

#<MatchData "bb12345">
(?-mix:^\d+$)
(?-mix:^a\d+$)
(?-mix:^bb\d+$)
(?-mix:^ccc\d+$)
(?-mix:^\w+$)
#<MatchData "ee12345">
#<MatchData "12345">
#<MatchData "22abcd">

转载注明原文:ruby – 在数组中找到第一个返回true的元素并返回该块的返回值 - 代码日志