ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

インスタンス変数を参照する attr_reader

クラスを定義するときにインスタンス変数を初期化することは多い。
そのインスタンス変数を読み込みたいときがある。
そんなときはattr_readerメソッドを使う。

目次


attr_readerとは

attr_readerとは、インスタンス変数を読み込むメソッドを定義するメソッド。
attr_readerについてはRubyリファレンスマニュアル参照。

Moduleクラス インスタンスメソッド
attr_reader
https://docs.ruby-lang.org/ja/latest/class/Module.html

attr_readerを使う書式は次のとおり。

attr_reader シンボル


シンボルには: + @なしの変数名が入る。
シンボルを,でつなぐと複数のシンボルを設定できる。
シンボルの:以下がメソッド名になる。
シンボルについてはRubyリファレンスマニュアルを参照。

Rubyリファレンスマニュアル ライブラリ一覧
組み込みライブラリ Symbolクラス
https://docs.ruby-lang.org/ja/latest/class/Symbol.html

attr_readerを使ったコードを書く

Regattaクラスを定義してattr_readerメソッドを試す。

attr_test.rb

#Regattaクラスを定義する
class Regatta
    attr_reader :tournament, :event
    
    def initialize
        @tournament = "全日本選手権"
        @event = "女子シングルスカル" 
    end

    def display(rank,crew)
        puts "#{@tournament} #{rank}#{crew}"
    end
end

#Regattaクラスのインスタンスをつくる
regatta = Regatta.new

#結果をためす
puts "直接呼び出す。"
puts "@event => #{@event}"
puts "eventメソッドで呼び出す。"
puts "regatta.event => #{regatta.event}"
puts "条件つき出力でためす。"
print "if @event == 女子シングルスカル: "
regatta.display(1,"Aボートクラブ") if regatta.event == "女子シングルスカル"
print "if @event == 男子シングルスカル: "
regatta.display(1,"Bボートクラブ") if regatta.event == "男子子シングルスカル"
print "\n"


コードの説明


テストコードの実行結果

コードを実行する。

ターミナル/PowerShell

ruby attr_test.rb


実行結果

直接呼び出す。
@event => 
eventメソッドで呼び出す。
regatta.event => 女子シングルスカル
条件つき出力でためす。
if @event == 女子シングルスカル: 全日本選手権 1着 Aボートクラブ
if @event == 男子シングルスカル: 


直接は呼み込めないインスタンス変数がattr_readerで定義したeventメソッドを使うと読み込めているのがわかる。
eventメソッドで呼び出したオブジェクトがif文の条件に使えている。

書き込み専用と読み書き用のメソッド

読み込み専用attr_readerのほかに次のメソッドもある。

書き込み専用: attr_writer
読み書き用: attr_accessor

今回の動作確認環境
macOS 10.13.4
Ruby 2.4.4p296
ターミナル 2.8.2

Windows10 1709
Ruby 2.5.1p57 [x64-mingw32]
Windows PowerShell 5.1.16299.251