Sunday, August 17, 2008

Ruby Accessor


アクセッサメソッドの等価コード
attr_rをModuleクラスに書くとうまくいくが
他のクラスやモジュールに書いてもなぜかうまくいかない

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  class Module

   4    private

   5    def attr_r(*arg)

   6      arg.each do |key|

   7        class_eval <<-EOS

   8          def #{key}

   9            @#{key}

  10          end

  11        EOS

  12      end

  13    end

  14  end

  15  

  16  class Book

  17    attr_r :isbn, :price

  18    def initialize(isbn, price)

  19      @isbn, @price = isbn, Float(price)

  20    end

  21  end

  22  

  23  b = Book.new(123, '10.45')

  24  p b.isbn

  25  p b.price

  26  # >> 123

  27  # >> 10.45


class_evalに代えてdefine_mothodを使う手もある
まあ結局evalするんだが

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  class Module

   4    private

   5    def attr_r(*arg)

   6      arg.each do |key|

   7        define_method("#{key}") do

   8          eval "@#{key}"

   9        end

  10      end

  11    end

  12  end

  13  

  14  class Book

  15    attr_r :isbn, :price

  16    def initialize(isbn, price)

  17      @isbn, @price = isbn, Float(price)

  18    end

  19  end

  20  

  21  b = Book.new(123, '10.45')

  22  p b.isbn

  23  p b.price

  24  # >> 123

  25  # >> 10.45


No comments: