Enumerable#find
方法通过评估直到它找到与 block 中的条件匹配的元素为止。第一次返回 block 未被评估为零时是否有类似的东西?想象一个人会有一组散列:
value = nil
options.each do |o|
break if value = o[:desired]
end
value ||= DEFAULT
难道没有一种方法可以做到这一点吗?
对集合进行大量转换没有意义,我想尽量减少分配次数,因此任何分配新数组的解决方案都不适合我。
最佳答案
find
方法将用于查找具有 :desired
键且迭代次数最少的第一个元素。
我认为您希望从 block 而不是元素本身获取 desired
键的值 - Enumerable
中没有任何方法表现得像 find
和 map
- 您将必须使用在 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/