本文簡要介紹ruby語言中 Enumerator類
的用法。
允許內部和外部迭代的類。
Enumerator
可以通過以下方法創建。
大多數方法有兩種形式:一種為枚舉中的每個項目評估內容的塊形式,以及一種返回包裝迭代的新 Enumerator
的非塊形式。
enumerator = %w(one two three).each
puts enumerator.class # => Enumerator
enumerator.each_with_object("foo") do |item, obj|
puts "#{obj}: #{item}"
end
# foo: one
# foo: two
# foo: three
enum_with_obj = enumerator.each_with_object("foo")
puts enum_with_obj.class # => Enumerator
enum_with_obj.each do |item, obj|
puts "#{obj}: #{item}"
end
# foo: one
# foo: two
# foo: three
這允許您將枚舉器鏈接在一起。例如,您可以通過以下方式將列表的元素映射到包含索引和元素的字符串:
puts %w[foo bar baz].map.with_index { |w, i| "#{i}:#{w}" }
# => ["0:foo", "1:bar", "2:baz"]
Enumerator
也可以用作外部迭代器。例如, Enumerator#next
返回迭代器的下一個值,如果 Enumerator
在末尾,則引發 StopIteration
。
e = [1,2,3].each # returns an enumerator object.
puts e.next # => 1
puts e.next # => 2
puts e.next # => 3
puts e.next # raises StopIteration
請注意,next
、next_values
、peek
和 peek_values
的枚舉序列不會影響其他非外部枚舉方法,除非底層迭代方法本身有副作用,例如 IO#each_line
。
此外,實現通常使用纖程,因此性能可能會更慢,並且異常堆棧跟蹤與預期不同。
您可以使用它來實現內部迭代器,如下所示:
def ext_each(e)
while true
begin
vs = e.next_values
rescue StopIteration
return $!.result
end
y = yield(*vs)
e.feed y
end
end
o = Object.new
def o.each
puts yield
puts yield(1)
puts yield(1, 2)
3
end
# use o.each as an internal iterator directly.
puts o.each {|*x| puts x; [:b, *x] }
# => [], [:b], [1], [:b, 1], [1, 2], [:b, 1, 2], 3
# convert o.each to an external iterator for
# implementing an internal iterator.
puts ext_each(o.to_enum) {|*x| puts x; [:b, *x] }
# => [], [:b], [1], [:b, 1], [1, 2], [:b, 1, 2], 3
相關用法
- Ruby Enumerator each_with_index用法及代碼示例
- Ruby Enumerator each_with_object用法及代碼示例
- Ruby Enumerator.peek_values用法及代碼示例
- Ruby Enumerator.each用法及代碼示例
- Ruby Enumerator each用法及代碼示例
- Ruby Enumerator.feed obj用法及代碼示例
- Ruby Enumerator.produce用法及代碼示例
- Ruby Enumerator.size用法及代碼示例
- Ruby Enumerator.new用法及代碼示例
- Ruby Enumerator.peek用法及代碼示例
- Ruby Enumerator.with_object用法及代碼示例
- Ruby Enumerator.each_with_object用法及代碼示例
- Ruby Enumerator.e + enum用法及代碼示例
- Ruby Enumerator.next_values用法及代碼示例
- Ruby Enumerator.next用法及代碼示例
- Ruby Enumerable.any?用法及代碼示例
- Ruby Enumerable min_by()用法及代碼示例
- Ruby Enumerable each_witth_object()用法及代碼示例
- Ruby Enumerable.slice_before用法及代碼示例
- Ruby Enumerable each_cons()用法及代碼示例
- Ruby Enumerable.uniq用法及代碼示例
- Ruby Enumerable uniq()用法及代碼示例
- Ruby Enumerable.find_all用法及代碼示例
- Ruby Enumerable.max用法及代碼示例
- Ruby Enumerable.map用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Enumerator類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。