Ruby クラス

#クラス
プログラミングでつくりたい「もの」を生成するには、まずその「設計図」を用意する必要があります。
設計図のことをクラス、「もの」のことをインスタンスと呼びます。

##インスタンスを生成するステップ
① クラスを用意する
② クラスからインスタンスを生成する
③ インスタンスに情報を追加する

###① クラスを用意する
まずはクラス（設計図）を用意します。
クラスは「class クラス名」とすることで定義できます。
クラス名は必ず大文字で始めることと、「end」を書く必要があります。

**例）**

```ruby
class Menu #クラス名は大文字で始める

end
```

###② クラスからインスタンスを生成する
クラス（設計図）を元に、新しくインスタンスを生成するには、「クラス名.new」とします。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができます。

**例）**

```ruby
class Menu
  
end

menu1 = Menu.new #Menuクラスからインスタンスを作成し、変数 menu1に代入
```

####インスタンス変数
インスタンス変数とは、インスタンスごとに独立して持つ変数である。
インスタンス変数のスコープはクラス内のメソッドであればどのメソッドでも生成した値と変わらず呼び出すことが可能です。

####attr_accessor
attr_accessorとはインスタンス変数にアクセスするために元からRubyに用意された機能のひとつです。
「attr_accessor :インスタンス変数」と入力します。
「attr_accessor :インスタンス変数」と書かないと、インスタンス変数にアクセスできないのでインスタンス変数を呼び出すことができません。

###③ インスタンスに情報を追加しよう
インスタンスに情報をもたせるには、インスタンス変数に値を代入する必要があります。
具体的には「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値を代入することができます。
また、「インスタンス.変数名」とすることで、そのインスタンス変数の値を用いることができます。

**例）**

```ruby
class Menu
  attr_accessor :name
  attr_accessor :price
end

menu1 = Menu.new
menu1.name = "すし" #インスタンス（menu1）のインスタンス変数（name）に文字列（"すし"）を代入している
puts menu1.name
```
コンソール

```
すし
```

##システムをつくる
###クラスに処理を追加する
クラスの中ではメソッドを定義することができます。
クラスの中で定義し、インスタンスに対して呼び出すメソッドのことを**インスタンスメソッド**と呼びます。
インスタンスメソッドは、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができます。

**例）**

```ruby
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def show  #showメソッドを定義
    puts "私はメニューです"
  end
end
menu1 = Menu.new
menu1.show　#クラスの中で定義したメソッドを呼び出す 
```
コンソール

```
私はメニューです
```

インスタンスメソッドも、メソッドと同様に引数を受け取ったり戻り値を返すことができます。


**例）**

```ruby
class Menu
  
  def show(data)  
    return "私は#{data}です"
  end
end
menu1 = Menu.new
puts menu1.show("メニュー")
```
コンソール

```
私はメニューです
```

###インスタンスメソッドの中でインスタンス変数を扱う
インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。

**例）**

```ruby
class Menu
  
  def show_name
    puts "私は#{self.name}です"
  end
end
menu1 = Menu.new
menu1.name = "ピザ"
menu1.show_name　#インスタンスメソッドの呼び出し
```
コンソール

```
私はピザです
```

インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。

##initializeメソッド
initializeメソッドとはインスタンスを生成した直後に処理を実行することができるメソッドである。
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。

**例）**

```ruby
class Menu
    ...
  def initialize
    puts "メニューが生成されました"
  end
    ...
end
menu1 = Menu.new
```
コンソール

```
メニューが生成されました
```

###initializeメソッドでインスタンス変数を扱う

**例）**

```ruby
class Menu
    ...
  def initialize
    self.name = "ピザ"  #インスタンス生成時に、"ピザ"をインスタンス変数nameに代入
  end
    ...
end
menu1 = Menu.new
puts menu1.name
```
コンソール

```
ピザ
```

###initializeメソッドの引数
initializeメソッドは通常のインスタンスメソッドと同じように、引数を渡すこともできます。 
その際、「クラス.new」に対して引数を渡すことで、initializeメソッドにその値を渡すことができます

**例）**

```ruby
class Menu
    ...
  def initialize(message)
    puts message
  end
    ...
end
menu1 = Menu.new("こんにちは")
```
コンソール

```
こんにちは
```

###initializeメソッドでインスタンス変数に値を代入する
initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンス毎にインスタンス変数の値を変えることができます。
また、キーワード引数を使うことで見やすく書くことができます。

**例）**

```ruby
class Menu
    ...
  def initialize(name:,price:)
    self.name = name
    self.name = price
  end
    ...
end
menu1 = Menu.new(name:"ピザ",price:800)
```

##インスタンスの配列
Menuクラスから生成したインスタンスも、配列の要素にすることが可能です。 

**例）**

```ruby

*
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize(name:, price:)
    self.name = name
    self.price = price
  end
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
end *

menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
  ...
menus = [menu1,menu2, ...]


menus.each do |menu|
  puts menu.info
end

# この例から、*～*の部分は「＊省略」とします。

```
コンソール

```
ピザ 800円
すし 1000円
  ...
```

###繰り返し処理で番号をつける
番号をつけるには、番号を保存するための変数をeach文の外で用意して、each文の処理の中で値を1だけ増やして更新するようにします。

**例）**

```ruby

# ＊省略

menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
  ...
menus = [menu1,menu2, ...]

index = 0

menus.each do |menu|
  puts "#{index}. #{menu.info}"
  index += 1
end
```
コンソール

```
0. ピザ 800円
1. すし 1000円
  ...
```

##gets.chomp
入力を受け付けるには「gets.chomp」を使います。このコードが実行されると、コンソールが入力待機状態になります。
「変数 = gets.chomp」とすることで、エンターキーを押されるまでに入力された値を変数に代入することができます。

**例）**

```ruby
puts "名前を入力してください"

name = gets.chomp  # 入力した内容を変数に代入
puts "#{name}さん、いらっしゃいませ"
```
コンソール

```
名前を入力してください
```
Yukihiroと入力すると...

```
Yukihiroさんいらっしゃいませ
```

数値の場合は、「gets.chomp.to_i」とすることで、入力された内容を数値に変換し、計算などにも使えるようになります。

**例）**

```ruby
puts "1つ100円のお菓子があります"
puts "いくつ買いますか?"

count = gets.chomp.to_i  # 入力した内容を数値に変換

total_price = 100 * count

puts "お会計は#{total_price}円です"
```
コンソール

```
1つ100円のお菓子があります
いくつ買いますか?
```
3と入力すると...

```
お会計は300円です
```

###require
別のファイルに入っているコードを一番上の行で、「require "./〇〇"」とすることで、別のファイルのコードを読み込めるようになります。

**例）**

〇〇.rb

```ruby
class 〇〇
  ...
  ...
end
```
△△.rb

```ruby
require "./〇〇"  # 〇〇.rbの読み込み

...
...
```

#おわり
[Ruby 基礎](https://qiita.com/y-takayama/items/fe031827297f0b6653b5)
[Ruby 基礎（配列について）](https://qiita.com/y-takayama/items/54c1a7b299af767d62ef)
[Ruby メソッド](https://qiita.com/y-takayama/items/d95a25be5797450e0e9d)