Menu
Coddy logo textTech

インスタンス変数

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 3/57。

インスタンス変数は@で始まり、1つのオブジェクトに属します。initializeに保存された値は、そのオブジェクトのすべてのメソッドで利用でき、各インスタンスは独自のコピーを持ちます。

class Dog
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name} says Woof"
  end
end

rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speak

出力:

Rex says Woof
Bella says Woof

メソッドはインスタンス変数を変更できるため、オブジェクトは自分に何が起きたかを記憶します。インスタンス変数を合わせたものが、オブジェクトの状態です:

class Counter
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end

  def report
    "count is #{@count}"
  end
end

clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.report

出力:

count is 2

インスタンス変数には、オブジェクトの外部からアクセスできません。外部のコードはメソッドを呼び出すことしかできないため、値を共有したいクラスは、その値を返すメソッド、つまりリーダーを定義します。

class Dog
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

rex = Dog.new("Rex")
puts rex.name
begin
  rex.age
rescue NoMethodError => e
  puts e.message
end

出力:

Rex
undefined method `age' for an instance of Dog

一度も代入されていないインスタンス変数はnilであり、エラーを発生させません。そのため、名前を間違えても、別の空の変数をひっそり読み取ることになります。instance_variablesは、オブジェクトが実際に持っている変数を一覧表示します。

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

出力:

nil
[:@on]
challenge icon

チャレンジ

簡単

クラス Petを完成させてください。initialize(name, species, age)は3つの値を保存し、birthdayは年齢に1を加え、describeは1文を返します。名前がRex、種がdog、年齢が3のペットの場合、Rex is a 3 year old dogを返します。

用意されたコードは、最初の3行の入力(名前、種、年齢)からPetを作成し、4行目に指定された回数だけbirthdayを呼び出して、describeを出力します。

コードはpet.rbに記述します。main.rbには用意された入出力コードが含まれており、編集できません。

自分で試してみよう

require_relative 'pet'

# 提供された入出力コード: そのままにしておく
input = []
while (line = gets)
  input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ