オブジェクトを更に極める! (1/5)
作成:2012-08-25 20:23
更新:2012-08-25 20:23
更新:2012-08-25 20:23
■インスタンス変数とアクセサ
さて、前回、クラスを定義し、そのインスタンスを作って操作する基本について説明をしました。インスタンスでは、インスタンス変数と呼ばれるもので値を保持することができました。
このインスタンス変数、クラス内のメソッドで利用するのは簡単ですが、外部から利用しようとするとちょっと面倒な事になります。例えば、前回作ったクラスを考えてみましょう。
このHeloクラスのインスタンスは、Helo.new("taro")といったように名前を引数に指定して作成することができます。が、インスタンスを作った後で「あ、名前間違えた。修正しよう」と思ったら、どうすればいいのでしょうか。
が、こういうことって実際によくあるはずですね。もちろん、インスタンス変数の値を取り出したり変更したりするメソッドを作成してもいいのですが、いちいちそのためにメソッドを書くのも面倒です。そこで、もっと簡単にインスタンス変数にアクセスできる仕組みを用意することにしましょう。
下のリスト欄に、修正したスクリプトを用意しておきました。ここでは、Helo.new(”花子")として作成した後、obj.name = "hanako"として名前を変更しています。普通に「インスタンス.変数」というようにドットでインスタンスとインスタンス変数名をつなげて記述して、その変数にアクセスできています。
その秘密は、クラス定義にある「attr_accessor:name」という文にあります。これは、「アクセサ」というものの設定を行う文なのです。アクセサとは、インスタンス変数にアクセスするための機能です。これには以下のようなものが用意されています。
ただし、これらを使うとインスタンス変数の値が予想していなかった形に書き換えられる可能性もありますので、「本当にそのインスタンス変数は外部から自由にいじられてもかまわないものなのか?」ということをよく考えて使うようにしましょう。
このインスタンス変数、クラス内のメソッドで利用するのは簡単ですが、外部から利用しようとするとちょっと面倒な事になります。例えば、前回作ったクラスを考えてみましょう。
class Helo
def initialize(name="noname")
@name = name
end
def say
puts("Hello, " + @name + "!!")
end
end
このHeloクラスのインスタンスは、Helo.new("taro")といったように名前を引数に指定して作成することができます。が、インスタンスを作った後で「あ、名前間違えた。修正しよう」と思ったら、どうすればいいのでしょうか。
helo = Helo.new("taro")こんな具合にして、インスタンスの@nameの値が変更できるか?というと、これはできません。もちろん、helo.@nameでもダメです。インスタンス変数には、直接外部からアクセスすることはできないのです。
helo.name = "hanako"
が、こういうことって実際によくあるはずですね。もちろん、インスタンス変数の値を取り出したり変更したりするメソッドを作成してもいいのですが、いちいちそのためにメソッドを書くのも面倒です。そこで、もっと簡単にインスタンス変数にアクセスできる仕組みを用意することにしましょう。
下のリスト欄に、修正したスクリプトを用意しておきました。ここでは、Helo.new(”花子")として作成した後、obj.name = "hanako"として名前を変更しています。普通に「インスタンス.変数」というようにドットでインスタンスとインスタンス変数名をつなげて記述して、その変数にアクセスできています。
その秘密は、クラス定義にある「attr_accessor:name」という文にあります。これは、「アクセサ」というものの設定を行う文なのです。アクセサとは、インスタンス変数にアクセスするための機能です。これには以下のようなものが用意されています。
attr_accessor 変数の値の読み取り・書き換えを行うここでは、attr_accessor:nameとすることで、@nameの読み書きを可能にしていたのです。インスタンス変数を外部から利用できるようにしたい場合にはとても重宝する機能ですね。
attr_reader 変数の値の読み取りだけを行う
attr_writer 変数の値の書き換えだけを行う
ただし、これらを使うとインスタンス変数の値が予想していなかった形に書き換えられる可能性もありますので、「本当にそのインスタンス変数は外部から自由にいじられてもかまわないものなのか?」ということをよく考えて使うようにしましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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
※関連コンテンツ