Progate Ruby 個人的ざっくりまとめ

# 変数名が２語以上の場合は、アンダーバー（＿）を挟む

例）your_name


# 変数展開は(#{変数})の形式

```ruby:例
hello = "Hello"
puts "#{hello} World!" # Hello World!
```

※javascriptの場合

```javascript:例
var hello = "Hello";
var text = hello + " World!";
console.log(text); // Hello World!

// または

var text = `${price} World!`;
console.log(text); // Hello World!
```

※phpの場合

```php:例
$text = "Hello";
echo "{$text} World!"; // Hello World!
```


# 繰り返し処理

each文

```:形式
配列.each do |変数名|
  実行したい処理
end
```

```ruby:例
languages = ["English", "Japanese", "Chinese"]

languages.each do |language|
  puts language
end
```

```:結果
English
Japanese
Chinese
```


# ハッシュ

ハッシュとは、配列のそれぞれの値に「キー」をつけて管理することができる。（連想配列みたいな感じ）

```:形式
[キー1 => 値1, キー2 => 値2]
```

### ハッシュの要素を用いる場合
```ruby:例
user = ["name" => "田中", "age" => 20]
puts user["name"]
```

```:結果
田中
```

### ハッシュに要素の追加

```:形式
ハッシュ[新しいキー] = 値
```

```ruby:例
user = ["name" => "田中", "age" => 20]
user["from"] = "東京"
puts user
```

```:結果
["name" => "田中", "age" => 20, "from" => "東京"]
```

### ハッシュの省略

```ruby:例
user = ["name" => "田中", "age" => 20]

#↓

user = [:name => "田中", :age => 20]

#または

user = [name: "田中", age: 20]
#この書き方でも、要素を取得する場合シンボルが必要
puts user[:name] 
```


# メソッド

```:形式
def メソッド名
  処理
end
メソッド名 ←実行
```

```ruby:例
def introduce
  puts "こんにちは"
  puts "私は田中です。"
end
introduce
```
```:結果
こんにちは
私は田中です。
```

### 引数を受け取るメソッド

```ruby:例
def introduce(name)
  puts "こんにちは"
  puts "私は#{name}です。"
end
introduce("田中")
```
```:結果
こんにちは
私は田中です。
```
※引数を受け取るメソッドは、引数を渡さずにメソッドを呼び出すことはできない。（呼び出すとエラーになります）

### 真偽値を返すメソッド

メソッド名の直後に「?」マークをつけるだけ

```ruby:例
def negative?(number)
  return number < 0
end
puts negative?(5)
```
```:結果
false
```

### キーワード引数を持つメソッド

```ruby:例
def introduce(name:, age:, from:) #引数の後にコロン
  puts "私の名前は#{name}です。"
  puts "年齢は#{age}歳です。"
  puts "出身は#{from}です。"
end
introduce(name: "田中", age: 20, from: "東京")
```
```:結果
私の名前は田中です。
年齢は20歳です。
出身は東京です。
```


# クラス

クラスとは、インスタンスを作成する時の「元となる設計図のこと」

```ruby:形式
class Menu #クラス名の１文字目は必ず大文字
  #処理のまとまり
end
```


### インスタンスの生成

```ruby:例
class Menu
  #処理
end

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


### attr_accessorメソッド

「attr_accessorメソッド」は、クラスの外からインスタンス変数にアクセスできるメソッド

```ruby:例
class Introduce
  attr_accessor :name
  attr_accessor :age

  #initializeメソッドは、インスタンスが生成されたら自動で呼び出される
  def initialize(name:, age:)
    #インスタンスメソッドの中でインスタンス変数を扱うには「self.変数名」とする
    self.name = name
    self.age = age
  end

  def my_info
    return "私の名前は#{self.name}です。年齢は#{self.age}歳です"
  end
end

introduce = Introduce.new(name: "田中", age: 20)
introduce.name = "佐藤" #attr_accessorを使わないと上書きされない
puts introduce.my_info
```
```:結果
私の名前は佐藤です。年齢は20歳です。
```


### requireメソッド

「requireメソッド」は、外部ファイルを読み込んでくれるメソッド

```ruby:index.rb
require "./introduce"

introduce = Introduce.new(name: "田中", age: 20)
puts introduce.my_info
```
```ruby:introduce.rb
class Introduce
  attr_accessor :name
  attr_accessor :age

  #initializeメソッドは、インスタンスが生成されたら自動で呼び出される
  def initialize(name:, age:)
    #インスタンスメソッドの中でインスタンス変数を扱うには「self.変数名」とする
    self.name = name
    self.age = age
  end

  def my_info
    return "私の名前は#{self.name}です。年齢は#{self.age}歳です。"
  end
end
```
```:結果
私の名前は佐藤です。年齢は20歳です。
```


### クラスの継承

introduce.rbで定義したIntroduceクラスを親クラスとし、hobby.rbで定義したHobbyクラスを子クラスとしている。

※親クラスにあるメソッドと同名のメソッドを子クラスで定義すると、メソッドを上書きすることを「オーバーライド」という。

```ruby:hobby.rb
require "./introduce"

class Hobby < Introduce #子クラス < 親クラス
  attr_accessor :hobby
  
  def initialize(name:, price:, hobby:)
    #「super」は、オーバーライドしたメソッドの中で使用でき、親クラスの同名メソッドを呼び出せる
    #親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要がある
    super(name: name, age: age)
    self.hobby = hobby
  end

  def my_info
    return "私の名前は#{self.name}です。年齢は#{self.age}歳です。趣味は#{self.hobby}です。"
  end
end
```
```ruby:index.rb
require "./hobby"

introduce = Hobby.new(name: "田中", age: 20, hobby: "サッカー")
puts introduce.my_info
```
```:結果
私の名前は佐藤です。年齢は20歳です。趣味はサッカーです。
```


# gets.chomp

「gets.chomp」は、実行するとコンソールが入力待機状態になる

```ruby:例
puts "名前を入力してください。"
name = gets.chomp #ここで一旦処理が止まり、入力後に以下の処理が行われる
puts "こんにちは、#{name}さん。"
```

※数字を入力してもらう場合は、「gets.chomp.to_i」とすることで、文字列ではなく数値として認識させることができる