本文简要介绍ruby语言中 Enumerator::Lazy类
的用法。
Enumerator::Lazy
是 Enumerator
的一种特殊类型,它允许在不立即评估它们的情况下构造操作链,并在 as-needed 基础上评估值。为了做到这一点,它重新定义了大多数 Enumerable
方法,以便它们只是构造另一个惰性枚举器。
Enumerator::Lazy
可以使用 Enumerable#lazy
方法从任何 Enumerable
构造。
lazy = (1..Float::INFINITY).lazy.select(&:odd?).drop(10).take_while { |i| i < 30 }
# => #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: 1..Infinity>:select>:drop(10)>:take_while>
当调用任何未重新定义的 Enumerable
方法时执行真正的枚举,例如 Enumerable#first
或 Enumerable#to_a
(后者别名为 force
以获得更多语义代码):
lazy.first(2)
#=> [21, 23]
lazy.force
#=> [21, 23, 25, 27, 29]
请注意,大多数 Enumerable
方法可以在有或没有块的情况下调用,在 Enumerator::Lazy
上将始终需要一个块:
[1, 2, 3].map #=> #<Enumerator: [1, 2, 3]:map>
[1, 2, 3].lazy.map # ArgumentError: tried to call lazy map without a block
此类允许对长序列或无限序列进行惯用计算,以及在不构造中间数组的情况下链接计算。
使用缓慢计算的序列的示例:
require 'open-uri'
# This will fetch all URLs before selecting
# necessary data
URLS.map { |u| JSON.parse(URI.open(u).read) }
.select { |data| data.key?('stats') }
.first(5)
# This will fetch URLs one-by-one, only till
# there is enough data to satisfy the condition
URLS.lazy.map { |u| JSON.parse(URI.open(u).read) }
.select { |data| data.key?('stats') }
.first(5)
用“.eager” 结束一个链会生成一个非惰性枚举器,它适用于返回或传递给另一个需要普通枚举器的方法。
def active_items
groups
.lazy
.flat_map(&:items)
.reject(&:disabled)
.eager
end
# This works lazily; if a checked item is found, it stops
# iteration and does not look into remaining groups.
first_checked = active_items.find(&:checked)
# This returns an array of items like a normal enumerator does.
all_checked = active_items.select(&:checked)
相关用法
- Ruby Lazy.collect用法及代码示例
- Ruby Lazy.collect_concat用法及代码示例
- Ruby Lazy.flat_map用法及代码示例
- Ruby Lazy._enumerable_map用法及代码示例
- Ruby Lazy.enum_for用法及代码示例
- Ruby Lazy._enumerable_flat_map用法及代码示例
- Ruby Lazy.new用法及代码示例
- Ruby Lazy._enumerable_filter_map用法及代码示例
- Ruby Lazy._enumerable_collect用法及代码示例
- Ruby Lazy.filter_map用法及代码示例
- Ruby Lazy.to_enum用法及代码示例
- Ruby Lazy._enumerable_collect_concat用法及代码示例
- Ruby Lazy.map用法及代码示例
- Ruby List.append用法及代码示例
- Ruby LoadError类用法及代码示例
- Ruby List.prepend用法及代码示例
- Ruby LDAP.build用法及代码示例
- Ruby Logger类用法及代码示例
- Ruby Location.lineno用法及代码示例
- Ruby Location.label用法及代码示例
- Ruby Location.path用法及代码示例
- Ruby Logger.info用法及代码示例
- Ruby Location类用法及代码示例
- Ruby LDAP.new用法及代码示例
- Ruby LocalJumpError类用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Lazy类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。