インスタンス変数
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]チャレンジ
簡単クラス 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ