概要
Railsを使っていてyieldがたまに出てきたりしていて一瞬処理を思い出すために止まったことが時々ありました。
その際、処理を思い出す手助けとして自分が見たときに理解できるように書いてみました。
また「yieldとは」などは省かせていただき、処理の流れの説明がメインとなります。
yieldの処理の流れ
例えば
4文字固定の文字列を作らなければいけない場合、
入力された文字列が4文字未満の時は前に"0"を入れて4文字にします。
この場合、yieldを使用すると下記のようなコードになります。
def test(val)
case val.size
when 1
str = "000"+val
when 2
str = "00"+val
when 3
str = "0"+val
else
str = val
end
yield str if block_given?
end
a = "a"
b = "bb"
c = "ccc"
d = "dddd"
puts "1文字の場合"
test(a){|output|
puts output.inspect
}
#=>1文字の場合
#=>"000a"
puts "2文字の場合"
test(b){|output|
puts output.inspect
}
#=>2文字の場合
#=>"00bb"
puts "3文字の場合"
test(c){|output|
puts output.inspect
}
#=>3文字の場合
#=>"0ccc"
puts "4文字の場合"
test(d){|output|
puts output.inspect
}
#=>4文字の場合
#=>"dddd"
処理の流れとして
test(a){|output|
puts output.inspect
}
を実行した際にtest(val)
メソッドに処理が移動します。
そこでcase val.size
で対象の文字列数を取得して各ケースに分けます。
最後にblock_given?でブロックが存在したらyieldの処理を行う流れです。
僕は最初このブロックってなんだろうと思っていました。
ここでいうブロックは
{|output|
puts output.inspect
}
このまとまりがブロックになります。
このブロックが存在するとyield str
が実行されブロック内のoutput
にstrが代入され"000a"と表示されます。
Railsでの使用例
このようなyieldですが、実際にどのように使えるのかサンプルコードを書いていました。
対象はRailsを想定しています。
例えば
class Stock
def insert_string(val)
case val.size
when 1
str = "000"+val
when 2
str = "00"+val
when 3
str = "0"+val
else
str = val
end
yield str if block_given?
end
end
class StocksController < ApplicationController
def create
stock = Stock.new
stock.insert_string(params[:name]){|str|
stock.name = str
}
stock.save
end
end
これでnameの値が4文字未満なら前に"0"を追加させて4文字にして、そのデータをStockのnameに格納してsaveができます。
Railsはおまけですが、これでyieldの処理の流れは完了とないます。