【Ruby入門】インスタンスからクラスの変数を取得・変更する方法
Rubyは以下の図のようにインスタンスからクラスにアクセスできない仕様になってます。
# -*- coding: utf-8 -*- require 'date' # Musicクラスをつくる class Music # Musicクラスのインスタンスを初期化する def initialize(title) @title = title end end # Musicクラスのインスタンスを作成する music = Music.new "戦場のメリー・クリスマス" puts "曲名:" + music.title
一件、このコードは問題ないように見えますが、@titleは「クラスインスタンス変数」と呼ばれる変数として扱われるため、下記のエラーが生じアクセスすることができないのです。 実行結果:
undefined method `title' for #<Music:0x0000000003f91c28> (NoMethodError)
では、インスタンスからクラスの変数を取得・変更するにはどのようにすればよいでしょうか?
それには、ゲッターを使います。
ゲッター
オブジェクトの属性を取得する操作です。以下のように、ゲッターを使うとインスタンスから変数@titleを取得することが可能となります。
# -*- coding: utf-8 -*- # Musicクラスをつくる class Music # Musicクラスのインスタンスを初期化する def initialize(title) @title = title end # title属性のゲッターメソッド def title @title end end # Musicクラスのインスタンスを作成する music = Music.new "戦場のメリー・クリスマス" puts "曲名:" + music.title
実行結果:
曲名:戦場のメリー・クリスマス
ゲッターにより、インスタンスから変数を取得することができるようになりました。では、インスタンスの値を変更するにはどのようにしたらよいでしょうか?セッターを使います。
# -*- coding: utf-8 -*- # Musicクラスをつくる class Music # Musicクラスのインスタンスを初期化する def initialize(title) @title = title end # title属性のゲッターメソッド def title @title end # title属性のセッターメソッド def title=(value) @title = value end end # Musicクラスのインスタンスを作成する music = Music.new "戦場のメリー・クリスマス" # セッターを使ってtitileの値を変更する music.title = "ライディーン" puts "曲名:" + music.title
ゲッターとセッターを使うことにより、オブジェクトの値を取得・設定することが可能となりました。しかし、多数のインスタンス変数の全てについて、ゲッター・セッターメソッドを用いるのはかなり煩雑です。そこで、アクセサを使います。
アクセサとは
オブジェクトの属性を取得、設定する操作のことです。ゲッターとセッターを併せ持った操作です。
# -*- coding: utf-8 -*- # Musicクラスをつくる class Music # Musicクラスのインスタンスを初期化する def initialize(title,composer) @title = title @composer = composer end # title属性、age属性のアクセサ attr_accessor :title, :composer # Musicクラスのインスタンスの文字列表現を返す def to_s "#@title, #@composer" end end # Musicクラスのインスタンスを作成する music = Music.new '戦場のメリークリスマス', '坂本龍一' # アクセサを使ってtitileの値を変更する music.title = "ライディーン" puts "曲名:" + music.title + "\n作曲者:" + music.composer
これにより、ゲッターとセッターを一つ一つ定義することなく、オブジェクトの値を取得・更新することが可能です。とても、便利な操作ですので、この際に抑えておきましょう!