概要
ブロック有無の判断について
内容
メソッドの引数の最後に&付きの引数を定義することで
呼び元で渡したブロックを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