概要
自己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">