本文へスキップ
BecomeCoder

Rubyコース · 第7章 クラスとオブジェクト指向 · レッスン31

attr_accessorとメソッド ― インスタンス変数を外から読み書きする

ブラウザで完結

導入

インスタンス変数 @name は、そのままでは外部から直接読み書きできません。外から読み書きしたいときのために attr_accessor などの便利な仕組みが用意されています。

説明

class Dog
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "私は#{@name}#{@age}歳です"
  end
end

pochi = Dog.new("ポチ", 3)
puts pochi.introduce
puts pochi.name

pochi.age = 4
puts pochi.age
  • attr_accessor :name, :age を書くと、@name@age を読み書きするための name/name=age/age= メソッドが自動的に作られます。
  • 読み取り専用にしたいときは attr_reader、書き込み専用にしたいときは attr_writer を使います。
  • pochi.age = 4 のように、メソッド名 = 値 の形で呼び出すと、@age の値が書き換わります。

これによって、クラスの外から pochi.namepochi.age = 4 のように、まるで普通の変数のように扱えるようになります。

やってみよう

attr_accessorattr_reader に変えて、pochi.age = 4 がエラーになる(書き込みできなくなる)ことを確認してみましょう(コメントアウトして試すのもよいです)。

演習

Book クラスを定義し、attr_accessor :title を使って initialize(title)@title を設定してください。Book.new("Ruby入門") を作り、.titleputs で表示してください。

ヒント1を見る

class Book attr_accessor :title def initialize(title) @title = title end end のように書きます。

ヒント2を見る

puts Book.new("Ruby入門").title のように続けて書けます。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。