8-1 〜 8-3

class Drink#class名は頭文字が大文字である
  def name  #defとはdefineで定義するという意味
    "カフェラテ"
  end
end

drink = Drink.new#newメソッドでDrinkクラスのオブジェクトを新しく生成
puts drink.name#メソッドの呼び出しは オブジェクト.メソッド
p drink.methods#methodsメソッドはオブジェクトが呼び出すことのできるメソッドの一覧表示を行う

オブジェクト.class でそのオブジェクトの属するclassを表示する
すべてのオブジェクトはいずれかのclassに属する

8-3

class Drink
  def order(name)#引数として受け取ったオブジェクトをnameに代入
    puts "#{name}をください"
  end
end

drink = Drink.new
drink.order("カフェラテ")#orderメソッドを実施して引数として"カフェラテ"を渡した

class Drink
  def name
    "カフェラテ"
  end

  def order
    puts "#{name}をください"
  end

end
drink = Drink.new
drink.order

8-3

class Drink
  def name
    p self  #selfでレシーバーを取得 selfはレシーバーが何かを明らかにしてくれる 表示方法はclassのIDを表示する
    "モカ" + topping #同じクラスのtoppingメソッドを呼び出した
  end

  def topping
    "エスプレッソショット"
  end
end

drink = Drink.new
p drink
puts drink.name

8-4

class Drink
  def order(item)
    puts "#{item}をください"
    @name = item #このとき、@nameをnameとローカル変数にしてしまうとreorderメソッドを実行する際スコープの範囲外であることから、nameがなんの事を言っているのかわからなくなるので「インスタンス変数」の@nameとしなければならない
  end

  def reorder
    puts "#{@name}をもう一杯ください"
  end

  def name
    @name #インスタンス変数であってもオブジェクト外では取得することができないので、@nameを戻り値にするメソッドを加えてあげるとできる
  end

end

drink1 = Drink.new
drink2 = Drink.new
drink1.order("カフェラテ")
drink2.order("モカ")
drink1.reorder
drink2.reorder
puts drink1.name
puts drink2.name

8-4

class Drink#name=メソッド
  def name=(text)
    @name = text
  end

  def name
    @name
  end

end

drink = Drink.new
drink.name= "カフェラテ"# drink.name = "カフェラテ" と書くこともできる
puts drink.name
p drink.instance_variables# => [:@name]  .instance_variablesは指定したオブジェクトのインスタンス変数一覧を出力する

8-5

class Drink
  def initialize #initializeは初期値を設定することができる
    puts "オブジェクト!"
  end
end

Drink.new#今まで通りであればなにもない空のオブジェクトができるはずだが、initializeメソッドにより自動で文字が入った
#=> オブジェクト!

class Drink
  def initialize
    @name = "カフェラテ"
  end

  def name
    @name
  end

end

drink = Drink.new#自動的にinitializeメソッドが呼び出される
puts drink.name
#=> カフェラテ

class Drink
  def initialize(name)#引数としてname
    @name = name
  end
  def name
    @name
  end
end

drink = Drink.new("モカ")#受け渡す"モカ"
puts drink.name

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

drink1 = Drink.new("カフェラテ")
drink2 = Drink.new("コーヒー")
drink3 = Drink.new("モカ")

puts drink1.name
puts drink2.name
puts drink3.name

8-6

インスタンスメソッドとクラスメソッド

インスタンスメソッド・・・レシーバーが「インスタンス」であるメソッド(drink.order や [1,2,3].size などオブジェクトに対して掛かる)

クラスメソッド・・・レシーバーが「クラス」であるメソッド(Drink.new や Array.new などClassに対して掛かっている)

<クラスメソッドの定義>

`def self.メソッド名

end`

class Cafe
  def self.welcome#----------クラスメソッドを定義する際はメソッドの前に「self」をつける---------
    "いらっしゃいませ"
  end
end

puts Cafe.welcome
#=> いらっしゃいませ

class Cafe
  def self.welcome
    "いらっしゃいませ"
  end
  def self.welcome_again
    welcome + "いつもありがとうございます"#---------クラスメソッド「welcome」を呼び出す。メソッド名書けばOK-------
  end
end

puts Cafe.welcome_again
#=> "いらっしゃいませいつもありがとうございます"

*クラスメソッドの別の定義方法

class Cafe
  class << self
    def welcome
      "いらっしゃいませ"
    end
  end
end

puts Cafe.welcome
#=>いらっしゃいませ