圧倒的備忘録

忘却は罪である。

【Ruby入門】インスタンスからクラスの変数を取得・変更する方法

Rubyは以下の図のようにインスタンスからクラスにアクセスできない仕様になってます。 f:id:istn:20180824170755p:plain

# -*- 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)

では、インスタンスからクラスの変数を取得・変更するにはどのようにすればよいでしょうか?

f:id:istn:20180824172449p:plain それには、ゲッターを使います。

ゲッター

オブジェクトの属性を取得する操作です。以下のように、ゲッターを使うとインスタンスから変数@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

これにより、ゲッターとセッターを一つ一つ定義することなく、オブジェクトの値を取得・更新することが可能です。とても、便利な操作ですので、この際に抑えておきましょう!