libro
www.tuyano.com
初心者のためのRubyプログラミング入門

オブジェクトを更に極める! (1/5)

作成:2012-08-25 20:23
更新:2012-08-25 20:23

■インスタンス変数とアクセサ

さて、前回、クラスを定義し、そのインスタンスを作って操作する基本について説明をしました。インスタンスでは、インスタンス変数と呼ばれるもので値を保持することができました。

このインスタンス変数、クラス内のメソッドで利用するのは簡単ですが、外部から利用しようとするとちょっと面倒な事になります。例えば、前回作ったクラスを考えてみましょう。
class Helo
  def initialize(name="noname")
    @name = name
  end
  def say
    puts("Hello, " + @name + "!!")
  end
end

このHeloクラスのインスタンスは、Helo.new("taro")といったように名前を引数に指定して作成することができます。が、インスタンスを作った後で「あ、名前間違えた。修正しよう」と思ったら、どうすればいいのでしょうか。
helo = Helo.new("taro")
helo.name = "hanako"
こんな具合にして、インスタンスの@nameの値が変更できるか?というと、これはできません。もちろん、helo.@nameでもダメです。インスタンス変数には、直接外部からアクセスすることはできないのです。

が、こういうことって実際によくあるはずですね。もちろん、インスタンス変数の値を取り出したり変更したりするメソッドを作成してもいいのですが、いちいちそのためにメソッドを書くのも面倒です。そこで、もっと簡単にインスタンス変数にアクセスできる仕組みを用意することにしましょう。

下のリスト欄に、修正したスクリプトを用意しておきました。ここでは、Helo.new(”花子")として作成した後、obj.name = "hanako"として名前を変更しています。普通に「インスタンス.変数」というようにドットでインスタンスとインスタンス変数名をつなげて記述して、その変数にアクセスできています。

その秘密は、クラス定義にある「attr_accessor:name」という文にあります。これは、「アクセサ」というものの設定を行う文なのです。アクセサとは、インスタンス変数にアクセスするための機能です。これには以下のようなものが用意されています。
attr_accessor    変数の値の読み取り・書き換えを行う
attr_reader    変数の値の読み取りだけを行う
attr_writer    変数の値の書き換えだけを行う
ここでは、attr_accessor:nameとすることで、@nameの読み書きを可能にしていたのです。インスタンス変数を外部から利用できるようにしたい場合にはとても重宝する機能ですね。

ただし、これらを使うとインスタンス変数の値が予想していなかった形に書き換えられる可能性もありますので、「本当にそのインスタンス変数は外部から自由にいじられてもかまわないものなのか?」ということをよく考えて使うようにしましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

class Helo
	attr_accessor:name
	
	def initialize(name="noname")
		@name = name
	end
	def say
		puts("Hello, " + @name + "!!")
	end
end

obj = Helo.new("花子")
obj.say
obj.name ="hanako"
obj.say

※関連コンテンツ

「初心者のためのRubyプログラミング入門」に戻る