Ruby 入門 [クラス]

#クラスとは
オブジェクトを作る方法(newメソッド)
● オブジェクト作成

クラス.new #=>そのクラスのオブジェクト

● クラスの定義(class)

```rb
class クラス名
end
```

● クラスのオブジェクトを作る

クラス.new #=>そのクラスのオブジェクト

#オブジェクトが呼び出せるメソッドを作る
● クラスでのメソッド定義

```rb
class クラス名
　def メソッド名
　end
end
```
● クラスに定義したメソッドを呼び出す

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

end

drink = Drink.new ————#①Drinkクラスのオブジェクトを作って変数drinkへ代入
puts drink.name ————#②Drinkクラスのオブジェクトのnameメソッドを呼び出す
↪️カフェラテ
```
● クラスに引数を受け取るメソッドを定義する

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

end

drink = Drink.new ————#Drinkクラスのオブジェクトを作って変数drinkへ代入
drink.order("カフェラテ") ————#orderメソッドを呼び出して引数で”カフェラテ”を渡す
↪️カフェラテ
```
● クラスの中で同じクラスのメソッドを呼び出す

```rb
class Drink
    def name
        "モカ" + topping ————#①同じクラスのtoppingメソッドを呼び出し
    end
    def topping
        "エスプレッソショット"
    end
end

drink = Drink.new ————#②
puts drink.name ————#③
↪️モカエスプレッソショット
```
#オブジェクトにデータを持たせる
● インスタンス変数

```rb
class Drink
    def order(item)
        puts "#{item}をください"
        @name = item ————#インスタンス変数@nameに注文した商品itemを代入
    end
    def reorder
        puts "#{@name}をもう一杯ください" —#orderメソッドで変数@nameに代入した商品を使う
    end
end

drink = Drink.new ——————#①
drink.order("カフェラテ") ————#②
drink.reorder ———————#④
↪️カフェラテをください
 カフェラテをもう一杯ください
```

● インスタンス変数を取得するメソッドを作る

```rb
class Drink
    def order(item)
        puts "#{item}をください"
        @name = item
    end
    def name ————#①nameメソッドを定義
        @name ————#②戻り値として@nameに代入されているオブジェクトを返す
    end
 end

drink = Drink.new
drink.order("カフェラテ")
puts drink.name ————#③drink.nameの戻り値を画面に表示しする
↪️カフェラテをください
 カフェラテ
```

● インスタンス変数へ代入するメソッドを作る

```rb
class Drink
    def name=(text) ————#①name=メソッドを定義した
        @name = text ———#③引数で渡された”カフェオレ”をインスタンス変数@nameへ代入
    end
    def name
        @name
    end
    
end

drink = Drink.new
drink.name="カフェオレ” ———#②name=メソッドを呼び出し、引数として”カフェオレ”を渡す
puts drink.name
↪️カフェオレ
```
● instance_variablesメソッド

```rb
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]
```
● selfを使ってレシーバーを調べる

```rb
class Drink
    def name=(text)
        p self ——————#②
        @name = text
    end
    def name
        @name
    end
    
end

drink = Drink.new
drink.name=("カフェラテ")
puts drink.name
p drink ————#①
↪️#<Drink:0x00007fc9f90d8980> ————①で表示したdrinkオブジェクト
 カフェラテ
 #<Drink:0x00007fc9f90d8980 @name="カフェラテ"> ————②でselfで取得してレシーバ
#:に続く文字列はそのオブジェクトの認識番号で、これが同じであれば同じオブジェクトです
```
#オブジェクトが作られる時に処理を行う
● initializeメソッド

```rb
class Drink
    def initialize ——————#①initializeメソッドを定義
        puts "新しいオブジェクト！"
    end
end

Drink.new ——#②newメソッド呼ばれるとオブジェクトが作られますが、その際にinitializeメソッド　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
↪️新しいオブジェクト! -------#が自動で呼ばれる。
```
● インスタンス変数の初期値設定する

```rb
class Drink
    def initialize
        @name = “カフェラテ”  ——#①インスタンス変数@nameに”カフェラテ”が代入されます
    end
    def name
        @name
    end
end

drink = Drink.new ——#②Drink.newしてオブジェクトが作られる時にinitializeメソッドが呼ばれる
puts drink.name
↪️カフェラテ
```
● initializeメソッドへ引数を渡す

```rb
class Drink
    def initialize(name) ———-#①initializeメソッドに引数を受け取るに定義しています
        @name = name ———#②引数で受け取ったオブジェクトを@nameへ代入します
    end
    def name
        @name
    end
    
end

drink = Drink.new("モカ") ———#③newメソッドを呼び出し”モカ”を渡しています
puts drink.name ————#④@nameの変数の中身を表示すると”モカ”
↪️モカ
```
#クラスを使ってメソッドを呼び出す
● クラスメソッドを定義する


def self.メソッド名
end

```rb
class Cafe
    def self.welcom ——————#①クラスメソッドを定義する時はメソッド名の前にself.をつける
        "いらっしゃいませ！"
    end
end

puts Cafe.welcom ———#②Class.welcomeのように、クラス名につづいて.メソッド名で呼び出すことができます。
↪️いらっしゃいませ！　　　　　　　　　　　　　　　　　　　　　　　　　　
```

● 同じクラスのメソッドを呼び出す

```rb
class Cafe
    def self.welcome
        "いらっしゃいませ！"
    end
    def self.welcome_again
        welcome + "いつもありがとうございます！" ————#クラスメソッドwelcomeを呼び出し
        
    end
end

puts Cafe.welcome_again
↪️いつもありがとうございます！
```
#継承を使ってクラスを分ける
● 継承を使ってクラスを分ける

class クラス名 < スーパークラス名
end

```rb
class Item
    def name
        @name
    end
    def name=(text)
        @name = text
    end
end

class Drink < Item ———#①
    def size
        @size
    end
    def size=(text)
        @size = text
    end
end
item = Item.new
item.name = "マフィン"

drink = Drink.new
drink.name = "カフェオレ" ——————#②
drink.size = "tall"
puts "#{drink.name} #{drink.size}サイズ"
↪️カフェオレ tallサイズ
```
①class Drink < Item　でクラスを定義すると、Itemクラスを継承したDrinkクラスを作ることができる。このDrinkクラスはItemクラスの全てのメソッドを受け継具ことができる。つまりここでは、Itemクラスとnameメソッドとname=メソッドをDrinkクラスでも使うことができる。

②でDrinkクラスのオブジェクトへ呼び出しているname=メソッドは、親にあたるItemクラスのname=メソッドを使っている。
 
● 親メソッドのメソッドを呼び出す -super

```rb
class Item
    def name
        @name
    end
    def name=(text)
        @name = text
    end
    def full_name ———#④superで呼び出される
        @name
    end
end

class Drink < Item
    def size
        @size
    end
    def size=(text)
        @size = text
    end
    def full_name ———#②full_nameを定義
      super ————#③親クラスの同名メソッドだ呼び出される
    end
end
item = Item.new
item.name = "マフィン"

drink = Drink.new
drink.name = "カフェオレ"
drink.size = "tall"
puts drink.full_name ———#①呼び出し
↪️カフェオレ
```
#メソッドの呼び出しを制限する
● クラスのメソッド定義の中だけで呼び出せるメソッドを作る

```rb
class Cafe
    def staff
        makanai —————#①
    end
    private ————#③以降で定義するメソッドをprivateなメソッドにする
    def makanai
        "店員用スペシャルメニュー"
    end
end

cafe = Cafe.new
puts cafe.staff
puts cafe.makanai ————#②
↪️店員用スペシャルメニュー
Traceback (most recent call last):
one.rb:13:in `<main>': private method `makanai' called for #<Cafe:0x00007f89db87c7d0> (NoMethodError)
```
● privateとpublic

```rb
class Foo
    def a ————#public
    end

    def b ————#public
    end

    private

    def c ————#private
    end

    public
    
    def d ————#public
    end
    
end

#Privateをメソッド定義するdefの前に書くことで、そのメソッドだけをprivateなメソッドにできる

class Foo
    private def a ————#private
    end
    
    def b —————#public
    end

end
```
● privateなクラスメソッドを定義する

```rb
class Foo
    private_class_method def self.a ——#メソッド定義のdefの前にprivate_class_methodと書く
      "method a"
    end
end

p Foo.a
↪️Traceback (most recent call last):
      one.rb:7:in `<main>': private method `a' called for Foo:Class (NoMethodError)
```