Ruby Enumerable : get the first which is not nil, 但结果必须是 block 内的内容

标签 ruby enumerable

Enumerable#find 方法通过评估直到它找到与 block 中的条件匹配的元素为止。第一次返回 block 未被评估为零时是否有类似的东西?想象一个人会有一组散列:

value = nil
options.each do |o|                     
  break if value = o[:desired]
end                                     
value ||= DEFAULT

难道没有一种方法可以做到这一点吗?

对集合进行大量转换没有意义,我想尽量减少分配次数,因此任何分配新数组的解决方案都不适合我。

最佳答案

find 方法将用于查找具有 :desired 键且迭代次数最少的第一个元素。

我认为您希望从 block 而不是元素本身获取 desired 键的值 - Enumerable 中没有任何方法表现得像 findmap - 您将必须使用在 block 内为其分配值的外部变量,如下所示。

options = [{foo: 1}, {desired: 2}, {bar: 3}]

value = nil
options.find do |o|
  value = o[:desired]
  break if value
end

p value
#=> 2

它或多或少看起来像您的代码,应该也能正常工作。

如果您想使用 Enumerable 方法,您可以使用下面的一种方法,但它会遍历所有元素。

p value = options.map { |o| value = o[:desired] }.compact.first

关于Ruby Enumerable : get the first which is not nil, 但结果必须是 block 内的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34656521/

相关文章:

ruby-on-rails - 在我的表单隐藏字段中发送数据

ruby-on-rails - Ruby:将对象添加到数组的末尾

ruby - 同时映射和选择

ruby - 了解 Ruby Enumerable#map(具有更复杂的 block )

ruby - 使用 Watir Webdriver 下载文件

ruby - 将输入存储到变量 Ruby

ruby - 我是否理解这个 Ruby grep 示例中的事件顺序?

ruby-on-rails - Nokogiri 不允许我在 Rails 中进行捆绑安装

ruby - 生成一组 float 会产生奇怪的结果

linq - Moq First()Last()和GetEnumerator()怪异