class Drink
def order(item)
@name = item
p "#{item} is #{price}"
end
def price
prices = {"coffee" => 300, "latte" => 400}
prices[@name]
end
def name
@name
end
def name=(text)
@name = text
end
end
drink = Drink.new
drink.order("coffee") # "coffee is 300"
p drink.name # "coffee"
# drink.name=("latte")
# drink.name= "latte"
drink.name = "latte"
p drink.name # "latte"
インスタンス変数
- オブジェクトは(記憶できる)データを持つことができる
- データを覚えたオブジェクトは、それぞれ異なる動作ができるようになる
インスタンス変数とは
- インスタンス(= オブジェクト)が持つ変数
- ローカル変数よりも広いスコープを持つ変数
- ローカル変数と違い、同じオブジェクトであれば、複数のメソッドをまたいで利用できる
- 寿命もオブジェクトと同じになり、オブジェクトが存在する限りずっとインスタンス変数は利用できる
class Drink
def order(item)
puts "#{item}をください"
@name = item # @name → インスタンス変数
end
def reorder
puts "#{@name}をもう一度ください"
end
end
drink = Drink.new
drink.order("コーヒー")
drink.reorder
# コーヒーをください
# コーヒーをもう一度ください
- インスタンス変数は代入が実行された時点で生成される
drink.order("コーヒー")
→@name
が生成される- なにも代入されていないと
nil
が返る
Drink.new
によって生成されたdrink
オブジェクトがインスタンス変数の持ち主- オブジェクトが存在する限り、インスタンス変数は利用できる
インスタンス変数はオブジェクトごとに存在する
- 同じクラスに書かれているインスタンス変数でも、オブジェクトが別なら別のインスタンス変数となる
class Drink
def order(item)
puts "#{item}をください"
@name = item
end
def reorder
puts "#{@name}をもう一度ください"
end
end
drink1 = Drink.new
drink2 = Drink.new
drink1.order("カフェラテ")
drink2.order("抹茶")
# カフェラテをください
# 抹茶をください
drink1.reorder
drink2.reorder
# カフェラテをもう一度ください
# 抹茶をもう一度ください
インスタンス変数を取得するメソッド attr_reader
- インスタンス変数は同じオブジェクトの中で利用できる
- オブジェクトの外でインスタンス変数を取得したい場合
- クラス内でインスタンス変数を戻り値とするメソッドを別に用意 → それを呼び出す
メソッドの命名
- 慣習的にインスタンス変数を取得するメソッドは
- インスタンス変数名から
@
を除いたものにすることが多い
- インスタンス変数名から
class Drink
def order(item)
puts "#{item}をください"
@name = item
end
def name # インスタンス変数を戻り値とするメソッドを別に用意
@name
end
end
drink = Drink.new
drink.order("コーヒー")
puts drink.name # コーヒー
インスタンス変数を取得するメソッドは、attr_reader
メソッドを使うと 1 行で定義できる
インスタンス変数へ代入するメソッド attr_writer
メソッドの命名
- 慣習的に、インスタンス変数名から
@
を取り除き、末尾に=
を加えた形にすることが多い - 以下の例の場合、
name=
が変数名になる
class Drink
def name=(text) # 変数名 → name= # インスタンス変数へ代入するメソッド
@name = text
end
def name
@name
end
end
drink = Drink.new
drink.name= "コーヒー" # メソッドの () を省略した記法 → drink.name=("コーヒー")
drink.name = "コーヒー" # ←とも記述できる
puts drink.name # コーヒー
- 変数名の末尾が
=
になっていると、メソッド名のname
と=
の間に半角スペースを空けることができるdrink.name= "コーヒー"
→drink.name = "コーヒー"
と記述できる- 慣習に従うことで、インスタンス変数への代入している様子が感覚的に分かりやすくなる
上記のメソッドは、attr_writer
メソッドを使うと 1 行で定義できる
メソッドの () は省略できる
- 省略できる場合は省略することが多い
- ただし、省略するのはあくまで「呼び出し側」で、「定義する側」はあまり省略しない
def calc(n)
n * n
end
p calc(5)
p calc 5
instance_variables
メソッド
- オブジェクトが持つすべてのインスタンス変数を返す
class Drink
def name=(text)
@name = text
end
def name
@name
end
end
drink = Drink.new
drink.name= "コーヒー"
puts drink.name # コーヒー
p drink.instance_variables
# [:@name]
initialize
メソッド
initialize
という名前のメソッドを定義すると- オブジェクトが新しく作られた時点で、自動的に記述された処理を実行する
class Drink
def initialize
p "hello"
end
end
drink = Drink.new
# "hello"
インスタンス変数の初期値を設定する
class Say
def initialize
@word = "hello" # 2.
end
def word
@word # 4.
end
end
say = Say.new # 1.
p say.word # 3.
# "hello"
new
メソッドでオブジェクトを作るinitialize
メソッドが呼ばれ、インスタンス変数に初期値が代入されるword
メソッドを呼ぶ- インスタンス変数に代入された値が戻り値となって返ってくる
- 初期値を設定していないと
nil
が返ってきてしまう- インスタンス変数は代入が実行された時点で生成される
class Say
def word
@word
end
end
say = Say.new
p say.word # nil
initialize
メソッドへ引数を渡す
initialize
メソッドに引数を受け取るように定義しておくとnew
メソッドを呼び出すときにオブジェクトを渡すことでinitialize
メソッドで引数として受け取ることができる
class Say
def initialize(word)
@word = word
end
def word
@word
end
end
say = Say.new("Hi")
p say.word
# "Hi"
- POINT
new
メソッドを呼び出して引数を渡すとinitialize
メソッドが自動的に呼び出される- 引数にセットされる
- インスタンス変数に代入される
- 初期値を引数で渡せるようになると
- 以下のようにオブジェクト各種を生成しやすくなる
class Say
def initialize(word)
@word = word
end
def word
@word
end
end
say1 = Say.new("Hello")
say2 = Say.new("Hi")
say3 = Say.new("Good Bye")
p say1.word # "Hello"
p say2.word # "Hi"
p say3.word # "Good Bye"