Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | メソッド | ブロック有無の判断

パンくず

Ruby
メソッド
ブロック有無の判断

概要

ブロック有無の判断について

内容

メソッドの引数の最後に&付きの引数を定義することで
呼び元で渡したブロックをProcとして受け渡すことができます。
この際、呼び出し側でブロックの指定をしたかどうか判断するために
以下の構文を使います。

def (first, &second)
  if block_given?
    # xxxx
  else
    # yyyy
  end
    # zzzz
end

サンプルコード

# encoding: Windows-31J

class Calculator
  def initialize(price, quantity, &calculator)
    if block_given?
      @calculator = calculator 
    else
      # デフォルトは割引なしを指定
      @calculator = lambda {|unit| 0.0}
    end
    @price, @quantity = price, quantity
  end
  
  def discount(discount_rate)
    base_sales = @price * @quantity
    return base_sales - (base_sales * @calculator.call(discount_rate))
  end
end

calculator = Calculator.new(100,10) {|unit| unit / 100.0 }
puts calculator.discount(5) # 5%割引
puts calculator.discount(10) # 10%割引

calculator = Calculator.new(100,10)
puts calculator.discount(5)
puts calculator.discount(10)

出力

950.0
900.0
1000.0
1000.0