この記事は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べんりですね。