Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2011年07月20日(水)

Proc のアクセサ

| 22:26 |  Proc のアクセサ - Going My Ruby Way を含むブックマーク はてなブックマーク -  Proc のアクセサ - Going My Ruby Way  Proc のアクセサ - Going My Ruby Way のブックマークコメント

(2011/07/22 Obsoleted by アクセサ定義 property - Going My Ruby Way - Rubyist)

--------

Proc のインスタンス変数のアクセサを、attr_accessor で定義すると

class C
  attr_accessor :handler
end

c = C.new
c.handler = proc do   # ここ!
  "hello"
end

c.handler.call

のようになり、「ここ!」のとこの '= proc ...' が嫌です。イテレータで渡したい。

c.handler do |...|
  ...
end

ので、proc の setter(兼getter) は以下のように書いてます。

def handler(&block)
  @handler = block || @handler
end

自分的にはパターンになっているのでモジュールにしました(思いつきで)。

module Accessor
  extend self
  def proc_accessor(name)
    module_eval %-  
      def #{name}(&block)
        @#{name} = block || @#{name}
      end
    -
  end
end

テスト。こんな感じで使います。

class C
  extend Accessor
  proc_accessor :handler
end

c = C.new

c.handler do |s|        # ブロックを与えると setter になる
  puts s + "!!"
end

c.handler.call("hello") # ブロックを与えないと getter