Class (vol.2 インスタンス変数)

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"

インスタンス変数

  • オブジェクトは(記憶できる)データを持つことができる
  • データを覚えたオブジェクトは、それぞれ異なる動作ができるようになる

インスタンス変数とは

code>@インスタンス変数 として定義する

class Drink
  def order(item)
    puts "#{item}をください"
    @name = item # @name → インスタンス変数
  end
  def reorder
    puts "#{@name}をもう一度ください"
  end
end

drink = Drink.new

drink.order("コーヒー")
drink.reorder
# コーヒーをください
# コーヒーをもう一度ください

インスタンス変数はオブジェクトごとに存在する

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

メソッドの命名

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 # コーヒー

上記のメソッドは、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 メソッド

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"
  1. new メソッドでオブジェクトを作る
  2. initialize メソッドが呼ばれ、インスタンス変数に初期値が代入される
  3. word メソッドを呼ぶ
  4. インスタンス変数に代入された値が戻り値となって返ってくる
class Say
  def word
    @word
  end
end

say = Say.new
p say.word # nil

initialize メソッドへ引数を渡す

class Say
  def initialize(word)
    @word = word
  end
  def word
    @word
  end
end

say = Say.new("Hi")
p say.word
# "Hi"
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"