LoginSignup
6
6

More than 5 years have passed since last update.

Ruby | Enumerator.new の利用サンプル

Posted at

Ruby | Enumerator.new の利用サンプル

概要

Ruby の Enumerator.new の利用サンプルです

ブロック無し

new(obj, method = :each, *args) -> Enumerator

ブロック無しの Enumerator.new は、あるレシーバーに対して each 以外のメソッドを
使って繰り返すオブジェクトを生成します。

サンプルコード

enumerator_methods = Enumerator.methods

slice_methods = Enumerator.new(enumerator_methods, :each_slice, 3)
slice_methods.each do |e|
  print e, "\n"
end
print slice_methods.take(5), "\n"
print slice_methods.map { |a, b, c|[c, b, a] }.take(5), "\n"

出力

[:allocate, :new, :superclass]
[:freeze, :===, :==]
[:<=>, :<, :<=]
[:>, :>=, :to_s]
[:inspect, :included_modules, :include?]
[:name, :ancestors, :instance_methods]
[:public_instance_methods, :protected_instance_methods, :private_instance_methods]
[:constants, :const_get, :const_set]
[:const_defined?, :const_missing, :class_variables]
[:remove_class_variable, :class_variable_get, :class_variable_set]
[:class_variable_defined?, :public_constant, :private_constant]
[:singleton_class?, :include, :prepend]
[:module_exec, :class_exec, :module_eval]
[:class_eval, :method_defined?, :public_method_defined?]
[:private_method_defined?, :protected_method_defined?, :public_class_method]
[:private_class_method, :autoload, :autoload?]
[:instance_method, :public_instance_method, :nil?]
[:=~, :!~, :eql?]
[:hash, :class, :singleton_class]
[:clone, :dup, :taint]
[:tainted?, :untaint, :untrust]
[:untrusted?, :trust, :frozen?]
[:methods, :singleton_methods, :protected_methods]
[:private_methods, :public_methods, :instance_variables]
[:instance_variable_get, :instance_variable_set, :instance_variable_defined?]
[:remove_instance_variable, :instance_of?, :kind_of?]
[:is_a?, :tap, :send]
[:public_send, :respond_to?, :extend]
[:display, :method, :public_method]
[:singleton_method, :define_singleton_method, :object_id]
[:to_enum, :enum_for, :equal?]
[:!, :!=, :instance_eval]
[:instance_exec, :__send__, :__id__]
[[:allocate, :new, :superclass], [:freeze, :===, :==], [:<=>, :<, :<=], [:>, :>=, :to_s], [:inspect, :included_modules, :include?]]
[[:superclass, :new, :allocate], [:==, :===, :freeze], [:<=, :<, :<=>], [:to_s, :>=, :>], [:include?, :included_modules, :inspect]]

ただし、ブロック無しでの Enumerator の仕様は非推奨です。
代わりに、 Object#to_enum の利用が推奨されています。

ブロック無しの代替としての Object#to_enum

サンプルコード

enumerator_methods = Enumerator.methods

slice_methods = enumerator_methods.to_enum(:each_slice, 3)
slice_methods.each do |e|
  print e, "\n"
end
print slice_methods.take(5), "\n"
print slice_methods.map { |a, b, c|[c, b, a] }.take(5), "\n"

※出力は、 Enumerator.new のブロックなしの例と同じです

ブロック有り

new(size=nil) {|y| ... } -> Enumerator

ブロックは Enumerator::Yielder オブジェクトを引数にとります。
Yielder オブジェクトに対して << をするたびにブロックが繰り返されます。

サンプルコード

lorem_ipsums を Enumerator として扱ってみます。
http://ja.wikipedia.org/wiki/Lorem_ipsum

lorem_ipsums = Enumerator.new do |y|
  lorem_ipsum = <<-EOS
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, nam.
Aliquam, hic tempora iure quibusdam voluptatibus natus perferendis maiores veritatis.
Doloribus dignissimos odio deleniti dolorum unde doloremque ex eaque voluptates.
Ea placeat dolor quam provident distinctio voluptatibus, fuga ut incidunt.
Ea, reiciendis repudiandae magnam aliquam eum debitis aliquid atque maiores.
  EOS

  lorem_ipsum = lorem_ipsum.gsub(/[\n,\.]/, '').split(' ')
  loop do
    y << lorem_ipsum.shift
    break if lorem_ipsum.empty?
  end
end

print lorem_ipsums, "\n\n"
print lorem_ipsums.to_a, "\n\n"
print lorem_ipsums.take(10), "\n\n"
print lorem_ipsums.map { |e|"「#{e}」" }.take(10), "\n\n"
print lorem_ipsums.take(10).join(', '), "\n\n"

出力

$ ruby enumerator_with_block.rb
#<Enumerator:0x0000060045f438>

["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit", "Suscipit", "namAliquam", "hic", "tempora", "iure", "quibusdam", "voluptatibus", "natus", "perferendis", "maiores", "veritatisDoloribus", "dignissimos", "odio", "deleniti", "dolorum", "unde", "doloremque", "ex", "eaque", "voluptatesEa", "placeat", "dolor", "quam", "provident", "distinctio", "voluptatibus", "fuga", "ut", "inciduntEa", "reiciendis", "repudiandae", "magnam", "aliquam", "eum", "debitis", "aliquid", "atque", "maiores"]

["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit", "Suscipit", "namAliquam"]

["「Lorem」", "「ipsum」", "「dolor」", "「sit」", "「amet」", "「consectetur」", "「adipisicing」", "「elit」", "「Suscipit」", "「namAliquam」"]

Lorem, ipsum, dolor, sit, amet, consectetur, adipisicing, elit, Suscipit, namAliquam

参照

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6