LoginSignup
1
1

More than 5 years have passed since last update.

配列にためる手間なしenum_for

Last updated at Posted at 2018-12-14

この記事はOkinawa.rb Advent Calendar 2018の14日目の記事です。
昨日は @hanachin_ さんのRubyでJavaScriptのTemplate literalsの真似をするでした。
明日は @naopontan@github さんのDateオブジェクトから和暦を得るです。

配列にためてますか

例えばこういうコードです。
WebAPIでページ数の上限が分かりません。
全部取るみたいな処理です。
なので無限ループで回しています。
取得した結果を配列にためて返しています。

def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def いろんな肉
  page = 1
   = []
  while true
    animals = 動物API.page(page)

    break if animals.empty?

     += animals
    page += 1
  end
  
end

いろんな肉.each do ||
  puts 
end
# 鶏
# 豚
# 牛

ためずにyield

つどつどyieldして渡すのでためておく必要がなくなりました。

def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def each_いろんな肉
  page = 1
  while true
    animals = 動物API.page(page)

    break if animals.empty?

    animals.each {|a| yield a }
    page += 1
  end
end

each_いろんな肉 do ||
  puts 
end
# 鶏
# 豚
# 牛

でもやっぱり配列でほしくなったら...?

enum_forを使うとyield結果を配列にできてべんり

enum_forしてからto_aするだけで配列に変換できてべんり

def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def each_いろんな肉
  page = 1
  while true
    animals = 動物API.page(page)

    break if animals.empty?

    animals.each {|a| yield a }
    page += 1
  end
end

def いろんな肉
  enum_for(:each_いろんな肉).to_a
end

puts いろんな肉.join("と") + "を全部焼いたもの"
# 鶏と豚と牛を全部焼いたもの

まとめ

  • 配列にためておきたいときはyieldでつどつど渡すと貯める必要がなくなってべんり
  • 配列にためたやつが欲しかったらenum_forで配列に変換できる

enum_forべんりですね。

1
1
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
1
1