This is a Ruby tree! It shows every object from the Ruby Programming Language in a tree format.
# Enumerator < Object --- # Includes: Enumerable (from ruby core) (from ruby core) --- A class which allows both internal and external iteration. An Enumerator can be created by the following methods. * Object#to_enum * Object#enum_for * Enumerator.new Most methods have two forms: a block form where the contents are evaluated for each item in the enumeration, and a non-block form which returns a new Enumerator wrapping the iteration. 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 This allows you to chain Enumerators together. For example, you can map a list's elements to strings containing the index and the element as a string via: puts %w[foo bar baz].map.with_index { |w, i| "#{i}:#{w}" } # => ["0:foo", "1:bar", "2:baz"] An Enumerator can also be used as an external iterator. For example, Enumerator#next returns the next value of the iterator or raises StopIteration if the Enumerator is at the end. 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 Note that enumeration sequence by `next`, `next_values`, `peek` and `peek_values` do not affect other non-external enumeration methods, unless the underlying iteration method itself has side-effect, e.g. IO#each_line. Moreover, implementation typically uses fibers so performance could be slower and exception stacktraces different than expected. You can use this to implement an internal iterator as follows: 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 --- # Class methods: new produce # Instance methods: + each each_with_index each_with_object feed inspect next next_values peek peek_values rewind size with_index with_object
This is MURDOC! A Ruby documentation browser inspired by Smalltalk-80. It allows you to learn about Ruby by browsing through its class hierarchies, and see any of its methods.