Tbpgr Blog

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

メタプログラミングRuby | イディオム | 自己yield

概要

自己yield

内容

Rubyはブロックにオブジェクト自身を渡すことができます。

サンプル

多数のフィールドを持つクラスを例にします。
※ここではフィールド数は3ですが実際はもっと大量にあるケースを想定します。

1はコンストラクタで設定する例。
2は各フィールドに設定する例。
3は自己yieldを利用したブロックで設定する例です。
どれが分かりやすいでしょうか?

  # encoding: utf-8
  require "pp"

  class ArgsPerson
    attr_accessor :first_name,:family_name,:age
    def initialize(first_name,family_name,age)
      @first_name,@family_name,@age = first_name,family_name,age
    end
  end

  sato = ArgsPerson.new("ichiro", "sato", 20)
  pp sato

  class FieldsPerson
    attr_accessor :first_name,:family_name,:age
    def initialize
    end
  end

  suzuki = FieldsPerson.new
  suzuki.first_name = "kantaro"
  suzuki.family_name = "suzuki"
  suzuki.age = "19"
  pp suzuki

  class SelfYieldPerson
    attr_accessor :first_name,:family_name,:age
    def initialize
      yield self if block_given?
    end
  end

  tanaka = SelfYieldPerson.new do |s|
    s.first_name = "kazuya"
    s.family_name = "tanaka"
    s.age = 24
  end
  pp tanaka

出力

#<ArgsPerson:0x292b378 @age=20, @family_name="sato", @first_name="ichiro">
#<FieldsPerson:0x28426c8
 @age="19",
 @family_name="suzuki",
 @first_name="kantaro">
#<SelfYieldPerson:0x2840358
 @age=24,
 @family_name="tanaka",
 @first_name="kazuya">