0
0

More than 5 years have passed since last update.

Ruby yieldの処理の流れ

Posted at

概要

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を想定しています。
例えば

app/models/stock.rb
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
app/contoller/stocks_controller.rb
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の処理の流れは完了とないます。

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