Ruby 基本文法【基礎編】

## はじめに
Ruby の基礎文法について、学習内容を載せておきます。
今回は、Rubyプログラミングの概要や変数、オブジェクトの種類に関する内容です。

## 目次
1. [Rubyプログラミングの特徴](#rubyプログラミングの特徴)
2. [変数](#変数)
3. [オブジェクト出力](#オブジェクト出力)
4. [文字列オブジェクト](#文字列オブジェクト)
5. [数値オブジェクト](#数値オブジェクト)
6. [比較演算子](#比較演算子)
7. [クラス・メソッドの出力](#クラスメソッドの出力)
8. [参考文献](#参考文献)

## Rubyプログラミングの特徴
### インタプリタ
プログラム実行の際、1行ずつ機械語に翻訳していく言語のため、コンパイル不要

### 変数に型がない
Ruby の変数はどんな型のデータも格納可能なため、変数の型を意識する必要なし

### 変数宣言不要
変数の種類は変数名から判断

### オブジェクト指向言語
全てのデータはオブジェクトとして扱い、クラスや継承も可能(<b>※多重継承は禁止</b>)

### メモリ管理不要
オブジェクトのメモリ解放は Ruby が自動的にしてくれるため、ガーベジコレクションの実施不要

### 特異メソッド
ある特定のオブジェクトへメソッドを付加することができる

### コメント
コメントアウトには、```#```または```=begin～=end```を使用します。

- 
    ```ruby
    # 単一行コメント

    =begin
        複数行の
        コメント
    =end
    ```

## 変数
変数は、以下の種類があります。
- [ローカル変数](#ローカル変数)
- [インスタンス変数](#インスタンス変数)
- [クラス変数](#クラス変数)
- [グローバル変数](#グローバル変数)
- [定数](#定数)

### ローカル変数
- <b>小文字または`_'</b>で定義
- <b>同スコープ内でのみ有効</b>

-
    ```ruby
    class Class
        def Method1
            # ローカル変数
            l = 1
        end

        def Method2
            puts(l)
            # => Method2 は Method1 と別スコープなので l は使用できない
            # => 未定義エラーとなる
        end
    end

    Class.Method2 # クラス内のメソッド呼び出し
    ```
    ```:実行結果
    Traceback (most recent call last):
        1: from hensuu.rb:14:in `<main>'
    hensuu.rb:8:in `Method2': undefined local variable or method `l' for Class:Class (NameError)
    ```
    <b>Method2 は Method1 と別スコープで```l```は使用できないため、未定義エラー</b>

### インスタンス変数
- ```@```で始まる変数
- <b>定義したクラスまたはサブクラスのメソッド</b>からs参照可能
- 初期値は```nil```
-
    ```ruby
    class Class
      def Method1(value)
          # インスタンス変数
          @i = value
      end

      def Method2
        puts(@i)
      end
    end

    test = Class.new()
    test.Method1(3)
    test.Method2()
    ```
    ```:実行結果
    3
    ```

### クラス変数
- ```@@```で始まる変数
- クラス定義内で定義され、全てのメソッドから参照または代入が可能
-
    ```ruby
    class Class
      # クラス変数
      @@c = 1
      def Method1
        puts @@foo
      end

      def Method2(value)
        puts @@c + value
      end
    end

    test = Class.new()
    test.Method1
    test.Method2(2)
    ```
    ```:実行結果
    3
    ```

### グローバル変数
- ```$```で始まる変数
- プログラムのどこからでも参照または代入が可能
- 初期値は```nil```
-
    ```ruby
    $g = "グローバル変数"

    def hensuu_type
      puts "この変数は #{$g}"
    end

    hensuu_type
    ```
    ```:実行結果
    この変数は グローバル変数 です
    ```

### 定数
- <b>アルファベット大文字 ([A-Z]) </b>で定義 ： 最初だけ大文字、全て大文字どちらでもOK
- 単語の区切りとして```_```を使用
- <b>一度代入後、値を変更可</b> ： 変更できるが<b>上書きや再定義エラーは出る</b>
- <b>メソッド内</b>では定義不可
- クラス外からも```クラス名::定数名```で参照可能
    ```ruby
    class Ruby
      COLOR = 'Ruby'
    end

    class Go
      COLOR = 'Go'
      COLOR = 'PHP' # 値の上書き
    end

    # 定数呼び出し
    p Ruby::COLOR
    p Go::COLOR
    ```
    ```:実行結果
    const.rb:7: warning: already initialized constant Go::COLOR # 上書きエラー
    const.rb:6: warning: previous definition of COLOR was here # 再定義エラー
    "Ruby"
    "PHP" # 「Go」から「PHP」へ値は変更されてる
    ```

## オブジェクト出力
変数や定数の値を出力することをオブジェクト出力と言います。
オブジェクト出力は、```puts```, ```p```, ```print```で行いますが各々微妙な違いがあります。

### puts
- オブジェクト末尾に<b>自動的に改行が付与されます</b>。
- <b>末尾に改行コードがある場合</b>、自動的な改行付与はされません。
- ```''```で囲まれている場合、改行コード等の<b>エスケープ文字はそのまま出力されます</b>。
    ```ruby
    def hello_ruby
        puts "Hello Ruby!"
        puts "Hello Ruby!\n"
        puts 'Hello Ruby!\n'
    end

    hello_ruby # メソッド呼び出し
    ```
    ```:実行結果
    Hello Ruby!
    Hello Ruby!
    Hello Ruby!\n
    ```

### p
- オブジェクト末尾に<b>自動的に改行が付与されます</b>。
- 文字列は```""```で囲われて出力されます。
- ```""```や```''```に関わらず、改行コード等の<b>エスケープ文字はそのまま出力されます</b>。
- ```''```で囲まれている場合、```\```が追加出力されます。
    ```ruby
    p "Hello Ruby!"
    p "Hello Ruby!\n"
    p 'Hello Ruby!\n'
    ```
    ```:実行結果
    "Hello Ruby!"
    "Hello Ruby!\n"
    "Hello Ruby!\\n"
    ```

### print
- オブジェクト出力時、<b>改行は付与されません</b>。
- ```''```で囲まれている場合、改行コード等の<b>エスケープ文字はそのまま出力されます</b>。
-
    ```ruby
    print "Hello Ruby!"
    print "Hello Ruby!\n"
    print 'Hello Ruby!\n'
    ```
    ```:実行結果
    Hello Ruby!Hello Ruby!
    Hello Ruby!\n
    ```

## 文字列オブジェクト
- クラスは<b> String</b>
- 文字列オブジェクトは、以下方法で作成できます。
  - ```String```クラスで用意されている```new```メソッド ： String.new(文字列)
  - ```""```または```'```で文字列を囲む
    ```ruby
    def output_string
      puts String.new("Hello Ruby!")
      puts "Hello Ruby!"
    end

    output_string
    ```
    ```:実行結果
    Hello Ruby!
    Hello Ruby!
    ```

### 連結
```+```で文字列同士を連結・出力することができます。

- 
    ```:フォーマット
    puts 文字列 + 文字列
    ```
    ```ruby
    puts "Hello Ruby" + " Go!"
    ```
    ```:実行結果
    Hello Ruby Go!
    ```
### 式展開
- ```""```で囲まれた文字列の中に式を記述することができます。
- プログラム実行時、式が評価・計算されてその結果が文字列として出力されます。
    ```:フォーマット
    #{式}
    ```
    ```ruby
    print("年齢は #{10 - 5} です")
    ```
    ```:実行結果
    年齢は 5 です
    ```

### ループ
```*```を使って、文字列を繰り返し出力することができます。

- 
    ```:フォーマット
    puts 文字列 * 繰り返し回数
    ```
    ```ruby
    puts "Hello★" * 3
    ```
    ```:実行結果
    Hello★Hello★Hello★
    ```

### 文字数カウント
```length```メソッドで文字数を出力することができます。

-
    ```:フォーマット
    puts 文字列.length
    ```
    ```ruby
    str = "Hello Ruby!"
    puts str.length
    ```
    ```:実行結果
    11
    ```
 ### 文字列から数値へ変換
```to_i```メソッドを使って、文字列を数値型へ変換することができます。

- 
    ```:フォーマット
    puts 文字列.to_i
    ```
    ```ruby
    str = "123"
    puts str # 文字列
    puts str.to_i # 数値へ変換
    ```
    ```:実行結果
    "123"
    123
    ```

## 数値オブジェクト
- 値によってクラスが異なります。
  - <b>Integer(整数)、Float(浮動小数点数)、Complex(複素数)、Rational(有理数)</b>
- 文字列オブジェクトのように、<b>```new```メソッドでのオブジェクト作成はできません</b>。
- 整数値は、 2 進数、 8 進数、 16 進数の形式も記述できます。
    ```
    10進数  214
    2進数  0b11010110 # 先頭に「０b」が付く
    8進数  0326 # 先頭に0が付く
    16進数  0xD6 # 先頭に「０x」が付く
    ```
    ```ruby
    def output_numeric
      puts 10
      puts 3.14
    end

    output_numeric
    ```
    ```:実行結果
    10
    3.14
    ```

### 演算
演算で使用される演算子は以下の通りです。
| 演算子 | 意味 | 例 |
|:------:|------------:|:------------:|
|+|加算|2 + 1|
|-|減算|2 - 1|
|*|乗算|2 * 1|
|/|除算|2 / 1|
|%|剰余|2 % 1|
|**|累乗|2 ** 3|
- 
    ```ruby
    def calc_numeric
      print("2 + 1 = ", 2 + 1, "\n")
      print("2 - 1 = ", 2 - 1, "\n")
      print("2 * 1 = ", 2 * 1, "\n")
      print("2 / 1 = ", 2 / 1, "\n")
      print("2 % 1 = ", 2 % 1, "\n") # 2 / 1 の余り
      print("2 ** 3 = ", 2 ** 3, "\n") # 2 * 2 * 2
    end

    calc_numeric
    ```
    ```:実行結果
    2 + 1 = 3
    2 - 1 = 1
    2 * 1 = 2
    2 / 1 = 2
    2 % 1 = 0
    2 ** 3 = 8
    ```

### 四捨五入 ・ 切り上げ ・ 切り捨て
- ```round```メソッド ： 四捨五入
- ```ceil```メソッド ： 切り上げ
- ```floor```メソッド ： 切り捨て
    ```:フォーマット
    p (式).round
    p (式).ceil
    p (式).floor
    ```
    ```ruby
    def output_round_ceil_floor
      # 四捨五入、切り上げ、切り捨て
      p 9.0/7
      p (9.0/7).round
      p (9.0/7).ceil
      p (9.0/7).floor

      # 出力桁数を指定の上で、四捨五入、切り上げ、切り捨て
      p (9.0/7).round(2)
      p (9.0/7).ceil(3)
      p (9.0/7).floor(5)
    end

    output_round_ceil_floor
    ```
    ```:実行結果
    1.2857142857142858
    1
    2
    1
    1.29
    1.286
    1.28571
    ```

### 小数点の出力桁数指定
```format```, ```sprintf```を使って、小数点の出力桁数を指定することができます。

- 
    ```:フォーマット
    format("%.桁数f", 対象数値)
    ```
    ```ruby
    def output_format
      calc = 7/6.0

      puts format("%.2f", calc)
      puts sprintf("%.2f", calc)
    end

    output_format
    ```
    ```:実行結果
    1.17
    1.17
    ```

### 数値から文字列へ変換
```to_s```メソッドを使って、数値を文字列型へ変換することができます。

- 
    ```:フォーマット
    puts 数値.to_s
    ```
    ```ruby
    str = 123
    puts str # 数値
    puts str.to_s # 文字列へ変換
    ```
    ```:実行結果
    123
    "123"
    ```
 
## 比較演算子
文字列または数値オブジェクトは、比較演算子による値の比較が可能です。
比較結果は、true または false で返ってきます。使用される演算子は以下の通りです。
| 演算子 | 意味 |
|:------:|:------------:|
|A == B|AとBは等しい|
|A != B|AとBは等しくない|
|A > B|AはBより大きい|
|A < B|AはBより小さい|
|A >= B|AはB以上|
|A <= B|AはB以下|

## クラス・メソッドの出力
### クラスの出力
```puts```や```p```でオブジェクトを出力する際、オブジェクト名の後ろに```.class```を付けることで、<b>対象オブジェクトのクラスを出力</b>することができます。

-
    ```ruby
    def output_class
      # 文字列オブジェクト
      puts "Hello Ruby!"
      puts "Hello Ruby!".class

      # 数値オブジェクト
      puts 10
      puts 10.class
      puts 3.14
      puts 3.14.class
    end

    output_class
    ```

    ```:実行結果
    Hello Ruby!
    String
    10
    Integer
    3.14
    Float
    ```

### メソッドの出力
オブジェクトを出力する際、オブジェクト名の後ろに```.methods```を付けることで、<b>対象オブジェクトのメソッドを出力</b>することができます。

-
    ```ruby
    def output_method
      # 文字列オブジェクト
      puts "Hello Ruby!"
      puts "Hello Ruby!".methods

      # 数値オブジェクト
      puts 10
      puts 10.methods
      puts 3.14
      puts 3.14.methods
    end

    output_method
    ```
※ 実行結果は長いので割愛します。

## 参考文献
<a href="https://docs.ruby-lang.org/ja/">プログラミング言語 Ruby リファレンスマニュアル</a>
<a href="https://qiita.com/shizen-shin/items/b61f03583ab8c76f1b19#%E5%B0%8F%E6%95%B0%E7%82%B9%E4%BB%A5%E4%B8%8B%E3%81%AE%E8%A8%88%E7%AE%97">【Ruby】基本コマンド一覧</a>
<a href="https://www.javadrive.jp/ruby/string/index1.html">文字列オブジェクトを作成する</a>
<a href="https://www.javadrive.jp/ruby/num/index1.html">数値オブジェクトを使用する</a>
<a href="https://www.sejuku.net/blog/19208">【Ruby入門】クラスメソッドの使い方｜呼び出し・その他メソッド</a>