バリケンのRuby日記 RSSフィード

2006-05-30

[] attr_reader, attr_writer, attr_accessor  attr_reader, attr_writer, attr_accessor - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  attr_reader, attr_writer, attr_accessor - バリケンのRuby日記  attr_reader, attr_writer, attr_accessor - バリケンのRuby日記 のブックマークコメント

Module#attr_readerは、インスタンス変数を外から参照するためのアクセサを定義するよ。たとえば

class Hoge
  def initialize (name)
    @name = name
  end

  attr_reader :name
end

a = Hoge.new('Hello, world!')
puts a.name

と書くと、実行結果は

Hello, world!

となるよ。ちなみに上記は次のように書いたのと同じことだよ。

class Hoge
  def initialize (name)
    @name = name
  end

  def name
    return @name
  end
end

a = Hoge.new('Hello, world!')
puts a.name

Module#attr_writerは、インスタンス変数に外から代入することを可能とするアクセサを定義するよ。たとえば

class Hoge
  attr_writer :name

  def to_s
    puts @name
  end
end

a = Hoge.new
a.name = 'Hello, world!'
a.to_s
a.class

とすると、実行結果は

Hello, world!
Hoge

となるよ。ちなみに上記は次のように書いたのと同じことだよ。

class Hoge
  def name=(val)
    @name = val
  end

  def to_i
    puts @name
  end
end

a = Hoge.new
a.name = 'Hello, world!'
a.to_i
a.class

Module#attr_accessorは、Module#attr_readerとModule#attr_writerの両方を指定したのと同じことになるよ。たとえば

class Hoge
  attr_accessor :name
end

a = Hoge.new
a.name = 'Hello, world!'
puts a.name

と書けば、実行結果は

Hello, world!

となるよ。ちなみに上記は

class Hoge
  def name
    return @name
  end
  def name=(val)
    @name = val
  end
end

a = Hoge.new
a.name = 'Hello, world!'
puts a.name

と書いたのと同じことだよ。

インスタンス変数には通常外からアクセスできないから、クラスを定義したいときには覚えておくと便利だよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060530