【Ruby】Rubyについて

# 記事概要
Rubyについて、まとめる。

# Rubyとは
- プログラミング言語の1つ
- 記述がシンプルでわかりやすく、実用的
- 大きなWebアプリケーションから小さなプログラムまで、さまざまなソフトウェアを作成可能

# Rubyの実行方法
## .rbファイル
rubyコマンドを実行する

1. `[ファイル名].rb`を作成
1. 上記で作成したファイルに、ソースコードを記述
1. rubyコマンドでプログラムを実行
    - ファイルのディレクトリに移動後、rubyコマンドを実行
        ```
        # Rubyファイルが存在するディレクトリに移動
        % cd ~/[Rubyファイルが存在するディレクトリ]
    
        # rubyコマンドの実行
        % ruby [ファイル名].rb
        ```
    - 絶対パスでRubyファイルを指定し、rubyコマンドを実行
        ```
        # rubyコマンドの実行
        % ruby /~/[Rubyファイルが存在するディレクトリ]/[ファイル名].rb
        ```

## ターミナル
irbコマンドを実行する

1. irbコマンドで、ターミナルから直接Rubyのプログラムを実行させる機能を起動する
    ```
    % irb
    ```
1. ソースコードを記述し、エンターボタンを押す
1. `exit`でプログラム実行機能を終了させる
    ```
    irb(main):001> exit
    ```
1. プロンプトが表示される
    ```
    %
    ```

## フレームワーク
### Sinatra
https://qiita.com/likapantrip/items/90d8f290731fce753afa

### Ruby on Rails(Rails)
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a

# Rubyの構成
## コメントアウト
コメントアウトする場合は、先頭に`#`を書く

```ruby
# コメントアウト

# コメントアウトは
複数行に適用されない
```

## バックスラッシュ記法
`\`から始まる文字の記法のこと
`"`で囲んだ文字列の中で、ただの文字ではなく改行などとして出力される

| 記法 | 意味 |
|---|---|
| \n | 改行 |
| \t | タブ |
| \b | バックスペース |
| \\ | バックスラッシュ |

```ruby
irb(main):001> puts "改行したい改行したい\n改行した"
改行したい改行したい
改行した
=> nil
```

## 文字列
文字を扱うための値

### 生成方法
`"`または`'`で囲む

```ruby
"Hello World!"

'Hello World!'
```

### 連結
文字列同士を`+`で繋ぐことで、文字列を連結できる

```ruby
irb(main):001> 'Hello ' + 'World!'
=> Hello World!
```

## 数値
数を表現する値であり、計算することが可能

### 生成方法
`"`や`'`を使用せず、数値を入力

```ruby
# 整数
10

# 負の値
-10

# 小数
3.14
```

### 演算子
値の計算や比較などに使用する記号のこと

### 代数演算子
四則計算を行う演算子

| 代数演算子 | 説明 |
|---|---|
| + | 足し算 |
| - | 引き算 |
| * | 掛け算 |
| / | 割り算 |
| % | 剰余(割ったあまり) |

```ruby
# 足し算
irb(main):001> 1000 + 2000
=> 3000

# 引き算
irb(main):002> 3000 - 1500
=> 1500

# 掛け算
irb(main):003> 50 * 40
=> 2000

# 割り算
irb(main):004> 600 / 15
=> 40

# 剰余（5 ÷ 2をした余り）
irb(main):005> 5 % 2
=> 1
```

### 自己代入演算子
自分自身に代入する演算子

| 自己代入演算子 | 例 | 処理 |
|---|---|---|
| += | num += 2 | numに2足した値をnum自身に代入 |
| -= | num -= 2 | numから2引いた値をnum自身に代入 |
| *= | num *= 2 | numに2かけた値をnum自身に代入 |
| /= | num /= 2 | numを2で割った値をnum自身に代入 |

```ruby
# 通常の代入演算子を使用した場合
irb(main):001> num = 1
=> 1
irb(main):002> num = num + 2
=> 3

# 自己代入演算子を使用した場合
irb(main):001> num = 1
=> 1
irb(main):002> num += 2
=> 3
```

### 比較演算子
値同士を比較する演算子

| 比較演算子 | 例 | 処理 |
|---|---|---|
| > | A > B | AはBより大きいか |
| >= | A >= B | AはB以上か |
| < | A < B | AはBより小さいか |
| <= | A <= B | AはB以下か |
| == | A == B | AとBは等しいか |

```ruby
# 1は20より小さいか？
irb(main):001> 1 < 20
=> true
```

### 論理演算子
式の真偽の確認や、真偽値に対しての演算を行う演算子

| 論理演算子 | 例 | 例の処理 | 処理 |
|---|---|---|---|
| != | A != B | AはBと等しくないか | AとBが等しくない場合に、”true”を返す |
| && | 条件A && 条件B | 条件Aと条件Bが共にtrueか | 2つの条件が共に”true”の場合は、”true”を返す<br>片方の条件が”false”の場合は、”false”を返す<br>2つの条件が共に”false”の場合は、”false”を返す |

```ruby
# 2 × 3 は6か？
irb(main):001> 2 * 3 == 6
=> true

# 2 × 3 は6ではないか？
irb(main):002> 2 * 3 != 6
=> false

# 2 × 3 は10ではないか？
irb(main):003> 2 * 3 != 10
=> true
```

### 真偽値
式が真か偽かを扱う値
真であれば`true`、偽であれば`false`になる

## 式
文字列や数値の他に、メソッドの呼び出し、変数や演算子式など
`"文字列"` `1000` `(1 + 5)`などは、すべて式

## 式展開
文字列の中に式を入れることができる機能

### 生成方法
`"`で囲んだ文字列の中で`#{式}`と記述する

```ruby
# 式展開で文字列に式を含む
irb(main):001> "今日で#{20}歳になりました"
=> "今日で20歳になりました"

# シングルクォーテーションだと式展開されない
irb(main):002> '今日で#{20}歳になりました'
=> "今日で\#{20}歳になりました"
```

## メソッド
プログラミングにおける何らかの処理をまとめたもの

### 処理
https://qiita.com/likapantrip/items/655e2c8fc2d4c02eb12e

### 戻り値
メソッドが処理された後の最終的な値のこと
返り値ともいう

```ruby
# 文字列だけだと、そのままその値が戻り値になる
irb(main):001> "Hello World"
=> "Hello World"

# 文字列にlengthメソッドを使うと、数値が戻り値になる
irb(main):002> "Hello World".length
=> 11
```

### return文
returnの後ろに続けた式がそのメソッドの戻り値に決まり、メソッドはその行の処理を終えると強制的に終了する

- `return ◯◯`と記述する

```ruby
# returnを利用した場合
irb(main):001* def sample
irb(main):002*   "1"
irb(main):003*   "2"
irb(main):004*   "3"
irb(main):005*   return "4" # ここで処理が終了し、戻り値になる
irb(main):006*   "5" # 呼び出されない
irb(main):007*   "6" # 呼び出されない
irb(main):008> end
=> :sample
irb(main):009> sample
=> "4"

# returnを省略した場合
irb(main):001* def sample
irb(main):002*   "1"
irb(main):003*   "2"
irb(main):004*   "3"
irb(main):005*   "4"
irb(main):006*   "5"
irb(main):007*   "6" # 最後の行が戻り値になる
irb(main):008> end
=> :sample
irb(main):009> sample
=> "6"
```

### 引数
メソッドなどに渡すことのできる値のこと

```ruby
def メソッド名(仮引数)
  # メソッドの処理
end
メソッド名(実引数) # メソッドの呼び出し

irb(main):001* def sample(number) # ②仮引数numberで、実引数「3」の値を受け取る
irb(main):002*   puts number * number # ③「3」が代入されたnumberを使って「3 * 3」を行い出力する
irb(main):003> end
=> :sample
irb(main):004> sample(3) # ①数値「3」を実引数にしてメソッドを呼び出し
9
=> nil
```

引数は複数渡すことができる
※実引数と仮引数の数は、必ず一致している必要がある

```ruby
def メソッド名(第一引数, 第二引数)
  # メソッドの処理
end
メソッド名(第一引数, 第二引数) # メソッドの呼び出し

irb(main):001* def sample (fruit,price)
irb(main):002*   puts "#{fruit}は、#{(price * 1.1).to_i}円(税込)です"
irb(main):003> end
=> :sample
irb(main):004> sample("りんご",100)
りんごは、110円(税込)です
=> nil
```

### スコープ
定義した変数が使える範囲のこと

|| defで定義するメソッドのスコープ | times,eachメソッドのスコープ |
|---|---|---|
| メソッドの外で定義した変数 | （引数を使わない限り）メソッドの中で使用できない | メソッドの中で使用できる |
| メソッドの中で定義した変数 | メソッドの外で使用できない | メソッドの外で使用できない |

## メソッドの定義
自分でメソッドを定義することも可能

### イメージ
[![Image from Gyazo](https://i.gyazo.com/fda2e6dd78bc5d66278bbaf528920cf8.png)](https://gyazo.com/fda2e6dd78bc5d66278bbaf528920cf8)

### 処理
```ruby
# メソッドの定義
def メソッド名
  # メソッドの処理
end
メソッド名 # メソッドの呼び出し

# メソッドの定義
irb(main):001* def say_hello
irb(main):002*   puts "Hello World"
irb(main):003> end
=> :say_hello

# メソッドの呼び出し
irb(main):004> say_hello
Hello World
=> nil
```

## 変数
値を入れる箱のようなもの

### イメージ
[![Image from Gyazo](https://i.gyazo.com/3b86f1618ba66251ffa71b27a67e33df.png)](https://gyazo.com/3b86f1618ba66251ffa71b27a67e33df)

### 宣言
変数を作ること

### 定義
宣言した変数にどのような値を入れるのか記述すること

### 代入
「変数の箱の中に値を入れる」という意味

- `=`を使用する

```ruby
# numという変数の中身を、1であると定義する
irb(main):001> num = 1
=> 1

# numを呼び出すと、格納された1が返ってくる
irb(main):002> num
=> 1

# 何度実行しても、格納された1が返ってくる
irb(main):003> num
=> 1
```

### 再代入
1度値を代入したあとの変数に、別の値を再び代入すること

```ruby
# 変数numに1を代入
irb(main):001> num = 1
=> 1

# 変数numを出力
irb(main):002> num
=> 1

# 変数numに2を再代入
irb(main):003> num = 2
=> 2

# 変数numを出力
irb(main):004> num
=> 2
```

### 命名規則
変数の名前は自由に決められるが、一定のルールがある

| 命名規則 | 説明 |
|---|---|
| 変数の中身が何かわかる | どんな名前もつけられるが、`aaa`のような意味のない名前は避ける |
| 小文字で始める | 大文字からも開始できるが、とくに理由がない場合は避ける |
| `_`で始めない | `_`からも開始できるが、とくに理由がない場合は避ける<br>2文字目以降には使える |
| 数字で始めない | 1文字目に使うとエラーが発生する<br>2文字目以降には使える |
| 日本語を使わない | 文字列以外では日本語は使えないため、変数名も日本語は使えない |
| スペースを含めない | 名前にスペースが入るとエラーが発生する |
| 予約語を使用しない | Rubyには文法などで使うことがあらかじめ決まっている単語があり、それを予約語と呼ぶ<br>これらを使うとエラーが発生する |

### 難しいこと
値に名前をつけて管理することは得意だが、複数の情報を管理することは難しい
[![Image from Gyazo](https://i.gyazo.com/5d45675c63c3be99bc1972376809a73b.png)](https://gyazo.com/5d45675c63c3be99bc1972376809a73b)

## 配列
1つの変数で複数の値を持つことのできる値であり、データと順番を紐づけて情報を管理する

- `変数 = []`で、配列を宣言する

### イメージ
[![Image from Gyazo](https://i.gyazo.com/94e79f31f6292c9c39ae532e07476d39.png)](https://gyazo.com/94e79f31f6292c9c39ae532e07476d39)

### 要素
配列の中のデータ

```ruby
# 配列membersの宣言
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]

# 配列membersの表示
irb(main):002> puts members
Naruto
Sasuke
Sakura
=> nil
```

### 要素の追加
生成済みの配列に対して、要素を新しく追加できる

- `配列 << 追加する要素`で、配列に要素を追加する

```ruby
# 配列membersの宣言
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]
irb(main):002> puts members
Naruto
Sasuke
Sakura
=> nil

# 要素の追加
irb(main):003> members << 'Sai'
=> ["Naruto", "Sasuke", "Sakura", "Sai"]
irb(main):004> puts members
Naruto
Sasuke
Sakura
Sai
=> nil
```

### 添字
配列の各要素に割り振られた番号のこと

- 各要素に対して自動的に、順番に割り当てられる
- 添字は「0」から始まる

### 要素の取得
配列に格納されている値を取得する際には、添字を使用する

- `配列[添字]`で、指定した添字の要素を取得する

```ruby
# 配列membersの宣言
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]

# 配列membersの添字1に格納されている要素を表示
irb(main):002> puts members[1]
Sasuke
=> nil
```

### 要素の変更
配列に追加されている要素を変更できる

- `配列[添字] = 値`で、指定した添字の要素を変更する

```ruby
# 配列membersの宣言
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]
irb(main):002> puts members
Naruto
Sasuke
Sakura
=> nil

# 配列membersの添字1の要素を変更
irb(main):003> members[1] = 'Sai'
=> "Sai"
irb(main):004> puts members
Naruto
Sai
Sakura
=> nil
```

### 要素の削除
配列の要素を削除できる

- 既存の要素が削除された場合、添字は繰上げられる

```ruby
# 配列membersの宣言
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]
irb(main):002> puts members
Naruto
Sasuke
Sakura
=> nil

# 配列membersの添字1に格納されている要素を削除
irb(main):003> members.delete_at(1)
=> "Sasuke"
irb(main):004> puts members
Naruto
Sakura
=> nil
irb(main):006> puts members[1]
Sakura
=> nil
```

### 難しいこと
複数の情報を順番で管理することは得意だが、複数の情報同士の関係性を示すことは難しい
[![Image from Gyazo](https://i.gyazo.com/0b95b1d55afeca7a14a8f56320d6d1d2.png)](https://gyazo.com/0b95b1d55afeca7a14a8f56320d6d1d2)

## ハッシュ
関係のある複数の値を管理するときに使用する

- `変数 = {}`で、ハッシュを宣言する

### イメージ
[![Image from Gyazo](https://i.gyazo.com/d4cf28f72f2070fd9312f12606a1d29d.png)](https://gyazo.com/d4cf28f72f2070fd9312f12606a1d29d)

### ハッシュの生成
`=>`を使用し、キーとバリューをセットにして記述する

```ruby
変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
```

### バリュー
ハッシュのデータ

### キー
ハッシュのデータに対応する名前
※文字列も数値も使用できる

### シンボル
見た目は文字列のようだが、コンピューターが処理するときには数値として扱われる値のこと
※ハッシュのキーとしてよく使われる

```ruby
# 以下はどちらもコンピューターが処理するときには同じ値として扱われる
:"name"
:name  # よく使用される
```

ハッシュ生成の記述
```ruby
# 文字列をキーに使用する書き方
member = {"name" => "Naruto"}

# ハッシュを使用し、文字列と同じ書き方
member = {:name => "Naruto"} 

# シンボルをキーに使用する場合のみ可能な書き方
member = {name: "Naruto"}  
```

### 要素の追加
生成済みのハッシュに対して、要素を新しく追加できる

- `ハッシュ[キー] = 値`で、ハッシュに要素を追加する

```ruby
# ハッシュmemberの生成
irb(main):001> member = {name: 'Naruto', height: 147.5}
=> {:name=>"Naruto", :height=>147.5}
irb(main):002> puts member
{:name=>"Naruto", :height=>147.5}
=> nil

# 要素の追加
irb(main):003> member[:age] = 13
=> 13
irb(main):004> puts member
{:name=>"Naruto", :height=>147.5, :age=>13}
=> nil
```

### 要素の取得
ハッシュの持っている値を取得する際には、キーを使用する

- `ハッシュ[キー]`で、ハッシュの要素を取得する

```ruby
# ハッシュmemberの生成
irb(main):001> member = {name: 'Naruto', height: 147.5}
=> {:name=>"Naruto", :height=>147.5}

# 要素の取得
irb(main):002> puts member[:name]
Naruto
=> nil
```

### 要素の変更
ハッシュに格納されている要素を変更できる

- `ハッシュ[キー] = 値`で、指定したキーの要素を変更する

```ruby
# ハッシュmemberの生成
irb(main):001> member = {name: 'Naruto', height: 147.5}
=> {:name=>"Naruto", :height=>147.5}
irb(main):002> puts member[:height]
147.5
=> nil

# 要素の変更
irb(main):003> member[:height] = 180
=> 180
irb(main):004> puts member
{:name=>"Naruto", :height=>180}
=> nil
```

### 要素の削除
ハッシュの要素を削除できる

```ruby
# ハッシュmemberの生成
irb(main):001> member = {name: 'Naruto', height: 147.5, weight: 40.6}
=> {:name=>"Naruto", :height=>147.5, :weight=>40.6}
irb(main):002> puts member
{:name=>"Naruto", :height=>147.5, :weight=>40.6}
=> nil

# 要素の削除
irb(main):003> member.delete(:weight)
=> 40.6
irb(main):004> puts member
{:name=>"Naruto", :height=>147.5}
=> nil
```

### 難しいこと
複数の情報同士の関係性を示すことは得意だが、同じ構造のまとまりを管理することは難しい
[![Image from Gyazo](https://i.gyazo.com/f3dc6502349ae6ab435826e5455e99c4.png)](https://gyazo.com/f3dc6502349ae6ab435826e5455e99c4)

## 配列とハッシュの違い
[![Image from Gyazo](https://i.gyazo.com/91721489450289c252f90ffb01030352.png)](https://gyazo.com/91721489450289c252f90ffb01030352)

[![Image from Gyazo](https://i.gyazo.com/3b4fc433c73dd6438e9bbd630ca2a978.png)](https://gyazo.com/3b4fc433c73dd6438e9bbd630ca2a978)

## 配列とハッシュの組み合わせ
別々の意味を持つ複数の値のまとまり自体を、複数管理することができる

### イメージ
[![Image from Gyazo](https://i.gyazo.com/e298aecfa01d297a693a81715de4feac.png)](https://gyazo.com/e298aecfa01d297a693a81715de4feac)

### 配列とハッシュの生成

```ruby
# 配列team7の宣言
irb(main):001> team7 = []
=> []

# ハッシュmemberの宣言
irb(main):002> member = {}
=> {}

# ハッシュmemberに要素を追加
irb(main):003> member[:name] = 'Naruto'
=> "Naruto"
irb(main):004> member[:height] = 147.5
=> 147.5

# ハッシュmemberを配列team7に追加
irb(main):005> team7 << member
=> [{:name=>"Naruto", :height=>147.5}]

# ハッシュmemberの宣言
irb(main):006> member = {}
=> {}

# ハッシュmemberに要素を追加
irb(main):007> member[:name] = 'Sasuke'
=> "Sasuke"
irb(main):008> member[:height] = 153
=> 153

# ハッシュmemberを配列team7に追加
irb(main):009> team7 << member
=> [{:name=>"Naruto", :height=>147.5}, {:name=>"Sasuke", :height=>153}]

# ハッシュmemberの宣言
irb(main):010> member = {}
=> {}

# ハッシュmemberに要素を追加
irb(main):011> member[:name] = 'Sakura'
=> "Sakura"
irb(main):012> member[:height] = 150.1
=> 150.1

# ハッシュmemberを配列team7に追加
irb(main):013> team7 << member
=> [{:name=>"Naruto", :height=>147.5}, {:name=>"Sasuke", :height=>153}, {:name=>"Sakura", :height=>150.1}]

# 配列team7を表示
irb(main):014> puts team7
{:name=>"Naruto", :height=>147.5}
{:name=>"Sasuke", :height=>153}
{:name=>"Sakura", :height=>150.1}
=> nil

# Sakuraの身長を表示
irb(main):015> puts team7[2][:height]
150.1
=> nil
```

### 表の作成
[![Image from Gyazo](https://i.gyazo.com/65165cd592bc4f175c7eaa90cf578db6.png)](https://gyazo.com/65165cd592bc4f175c7eaa90cf578db6)

## クラスとインスタンス
https://qiita.com/likapantrip/items/28dc379c57aec6177a74

## module
特定の役割を持つメソッドや定数に名前を付けてまとめたもの
`module`はどんなオブジェクトにも取り込んで使うことが可能

複数のクラスにまたがるメソッドや定数を`module`としてまとめることで、コードの肥大化を防いだり、複数クラスの特徴を継承させたいクラスを作成するときに利用する

```ruby
module モジュール名

end
```

```ruby
module Sample
  class Test
  end
end

# 呼び出す場合
Sample::Test
```

クラスとモジュールの違い
||クラス|モジュール|
|-|-|-|
|用途|具体的なオブジェクトを生成したい<br>(インスタンスを生成したい)|処理だけ(メソッドなど)が必要|

## 条件分岐処理
条件を満たしているかどうかで実行内容を分岐する処理であり、「条件分岐」とも呼ばれる
「もし〇〇だったら△△をする」と処理を分けられる

### 条件式
分岐の条件として記述する式

### if文
条件式が正しいか正しくないかで処理を分岐させることができる
返り値が`true`のときに、処理が実行される

```ruby
if 条件式
  # 条件式が真(true)のときに実行する処理
end

irb(main):001> value = 3
=> 3
irb(main):002* if value > 0
irb(main):003*   puts "値は正です"
irb(main):004> end
値は正です
=> nil
```

### else(if文)
条件式の結果が正しくない場合の処理を行う

```ruby
if 条件式
  # 条件式が真(true)のときに実行する処理
else
  # 条件式が偽(false)のときに実行する処理
end

irb(main):001> value = -3
=> -3
irb(main):002* if value > 0
irb(main):003*   puts "値は正です"
irb(main):004* else
irb(main):005*   puts "値は負です"
irb(main):006> end
値は負です
=> nil
```

### elseif(if文)
条件を満たさなかった場合に対して、ifのように条件式を追加できる

```ruby
if 条件式1
  # 条件式1が真(true)のときに実行する処理
elsif 条件式2
  # 条件式1が偽(false)のとき、かつ
  # 条件式2が真(true)のときに実行する処理
else
  # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end

irb(main):001> value = 0
=> 0
irb(main):002* if value > 0
irb(main):003*   puts "値は正です"
irb(main):004* elsif value < 0
irb(main):005*   puts "値は負です"
irb(main):006* else
irb(main):007*   puts "値は0です"
irb(main):008> end
値は0です
=> nil
```

### unless
条件式が正しいか正しくないかで処理を分岐させることができる
返り値が`false`のときに、処理が実行される

```ruby
unless 条件式
  # 条件式が偽(false)のときに実行する処理
end

irb(main):001> value = 3
=> 3
irb(main):002* unless value == 0
irb(main):003*   puts "値は0以外です"
irb(main):004> end
値は0以外です
=> nil
```

## 繰り返し処理
同じ内容を繰り返し行う処理であり、ループ処理とも呼ばれる

### 処理
https://qiita.com/likapantrip/items/655e2c8fc2d4c02eb12e#まとめ繰り返し処理

### ブロック
`do`と`end`で囲まれた処理のまとまりのこと

### ブロック変数
ブロック内でのみ使用できる変数のこと
`|任意の変数名|`で定義できる

```ruby
数値.times do |ブロック変数|
  # 繰り返す処理
  # 繰り返しの回数を使う場合、ブロック変数を使用する
end

irb(main):001* 3.times do |i|
irb(main):002*   puts i += 1
irb(main):003> end
1
2
3
=> 3
```

### 強制終了
プログラム実行中に、`control + C`で強制終了できる