ruby - 在数组中找到 block 返回 true 的第一个元素并返回 block 的返回值

标签 ruby

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

下面是我的代码。我是 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'

最佳答案

如果你想要 block 的结果,你可以这样做。这将遍历整个数组,但不会评估第一个之后的任何匹配项。

def find(s,t)
  RS[s].inject(nil) {|m, p| m || p.match(t)}
end

你可以早点突破做这样的事情

RS[s].inject(nil) {|m, p| (m && (break m)) || p.match(t)}

关于ruby - 在数组中找到 block 返回 true 的第一个元素并返回 block 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419760/

相关文章:

ruby-on-rails - 未初始化的常量 User::TaxCloud

ruby - 对于最大的回文乘积问题(Project Euler),递归中的堆栈级别太深

ruby-on-rails - rake db:migrate不创建表

ruby-on-rails - 乘客('Bundler:RubyVersionMismatch')

ruby - 将 && 运算符与非 bool 操作数一起使用

ruby-on-rails - 如何在 Ruby on Rails 中使用子 Controller ?

ruby - 如果父记录被销毁,如何防止 ActiveRecord::Observer 记录依赖记录的删除?

ruby-on-rails - 在 Mini_Test 中调用任何 Ruby 类和未初始化的常量错误

ruby-on-rails - 使用嵌套表单和 Rails 4 时如何防止创建空白?

ruby - 抢救 Selenium Webdriver 中的 ScriptError?