Ruby / Ruby on Rails 開発道中記 第1章 〜Rubyと友達になる〜

# はじめに
Qiita初投稿なので暖かい目で見てください。
よろしくお願いします。

# 本記事について
マイナビ出版から出されている[現場で使える　Ruby on Rails 5 速習ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)を元にしたまとめです。
定期的に書いていきたいと思います。
今回はRuby入門として最低限必要となる知識を綴っていきます。
ただし、全部ではなく重要になりそうな部分を抜粋していくことにします。
思いのほか長くなったので記事内で前編・後編分けました。

# 開発環境
- Ruby 2.2.7
- Atomエディタ
- ターミナル(macOS Mojave 10.14.3)
- 必要に応じてターミナルで試すよりも[paiza.IO](https://paiza.io/ja)で試してみるのもいいと思います。

# Ruby入門 (前編)　〜オブジェクトを理解しよう〜
- **Rubyは万物がオブジェクト、いわゆる「モノ」**

- **irb**：ターミナルに「irb」と打てばRubyを対話的に実行する事ができる。「quit」で終了できます。

- **文字列**：文字列オブジェクトは「''」シングルクォーテーションか「""」ダブルクォーテーションで内容を囲むだけです。
個人的には出力や式の中などに埋め込みたい時に「#{}」展開する場面があると思うので「""」ダブルクォーテーションを推奨します。シングルクォーテーションは展開不可です。 

```ruby:Hello.rb
puts 'Hello Ruby' # => Hello Ruby
puts "Hello Ruby" # => Hello Ruby
# #{}で展開可能(ただしダブルクォーテーションのみ)
msg = "Hello Ruby"
puts "Welcome to #{msg}" # => Welcome to Hello Ruby
```

- **クラス**：全てのオブジェクトが持っている「型」の事を「クラス」と言います。

(例) 犬のポチは「ポチ」がオブジェクトで「犬」がクラスです。赤ピクミンは「赤」がオブジェクトで「ピクミン」がクラスです。

```ruby:class_example.rb
puts "名前".class # => String
puts 123.class # => Integer
```

- **クラスとインスタンス**：「オブジェクトZのクラスがAであるとき、ZはAのインスタンスである」と言います。上記の犬のポチを例にすると「オブジェクト「ポチ」のクラスが「犬」であるとき、「ポチ」は「犬」のインスタンスである」。上記の"名前"はStringクラスのインスタンスだし、123はIntegerクラスのインスタンスです。

- **ローカル変数とインスタンス変数**： **ローカル変数**はその場限りの一時的な変数、他のメソッドからは使用不可。
**インスタンス変数**はオブジェクトの保持する変数、オブジェクトのどのメソッド内からも使用可能。特定のオブジェクト内部で使い回したり、そのオブジェクトに属するデータとして外部からゲッターを通じて利用させるために使用。

- **ゲッターとセッターの定義**
ゲッターもセッターも両方定義する時。:nameはシンボル。

```ruby:class_user.rb
class User
  attr_accessor :name
end
```

ゲッターのみ定義する場合。

```ruby:class_user.rb
class User
  attr_reader :name
end
```

セッターのみ定義する場合。

```ruby:class_user.rb
class User
  attr_writer :name
end
```

# Ruby入門 (前編) のまとめ
- Rubyの基本単位は全てオブジェクトで構成されている。
- オブジェクトはクラスから作られる。
- オブジェクトはメソッドやインスタンス変数を抱える。
- オブジェクトのデータがインスタンス変数、振る舞いがメソッドに当たる。
- インスタンス変数の種類、それぞれのメソッドの種類の具体的内容をクラスに定義し、その定義を使って同じ性質を持つ(インスタンス)オブジェクトを量産して使用する。

---

# Ruby入門 (後編)　〜基本文法と機能〜
- **OR演算**：|| か or
- **AND演算**：&& か and
- **XOR演算**：^
- **真偽の裏返し**：! か not
- **等しくないか**：!=
- **Rubyではnilとfalseが偽、それ以外は真となる。**
- **Rubyでは0も真になる(以下例)**

```ruby:zero_true.rb
value = 0
if value
  # -> true
end
```

- **nil? の使用例**

```ruby:nil_investigate.rb
return if value.nil? # value が nil なら以降の処理をしない
```

- **偽かどうかを調べる**

```ruby:not_investigate.rb
return if !value # value が nil または false なら以降の処理をしない
```

- **ifの返り値を変数に直接代入する事ができる**

ただし、elseが無く、どの条件にも該当しない場合はnilオブジェクトが返される

```ruby:number_message.rb
number = 100
message = if number > 50
            "numberは50より大きいです。"
          else
            "numberは50以下です。"
          end
```

- **unless**：条件結果が偽の場合に処理を実行する。unlessでもelseを使う事ができるがelsifのような機能は持たない。unlessとelseの併用はコードの把握がしづらいので避け、代わりにifを使うこと。

unlessの例

```ruby:unless.rb
age = 16
unless age >= 20
  puts "未成年に酒類は提供不可"
end
```

unlessの代わりにifを使った例

```ruby:unless.rb
age = 16
if age < 20
  puts "未成年に酒類は提供不可"
end
```

- **後置if(またはunless)**：条件が成立した時に評価してほしい句の後ろに置く事ができる。
else等が書けないため処理が複数行に渡ったり、elseなどの他の条件も書きたいときは通常のifを使う。
処理が1行で済む単純な場合に後置ifがよく使われる。

```ruby:back_end_if.rb
# 出力される
puts "Hello" if true
# 出力されない
puts "Good-bye" if false
```

- **配列**：配列の中に文字列、数値、false、nil、配列を要素として格納できる。
```["abc", 123, false, nil, [1, 2, 3, 4, 5]]```

- **each**：配列が持つ要素を順番に取得して、それらに何かしらの処理を実行したい場合にeachメソッドがよく使われる。

```ruby:each.rb
num = [1, 2, 3, 4, 5]
# 1, 2, 3, 4, 5 と順番に出力される
num.each do |element|
  puts element
end
```
- **配列への要素の追加**：<< を使って配列に要素を追加する。

```ruby:add.rb
num = [1, 2, 3, 4, 5]
num << 6
# 1, 2, 3, 4, 5, 6 と順番に出力される
num.each do |element|
  puts element
end
```

- **ハッシュ**

内部的にデータをキーと対応付けて格納しておくデータ構造の事。
ハッシュの特徴は、与えた「キー」によって求める値までを最短ルートで探し出せるところ。
ハッシュはHashクラスからなり、波括弧「{}」を使用して生成する事ができる。
波括弧の中にキー(key)と値(value)を組み合わせて書く。
**「シンボル」**と呼ばれるコロンで始まる識別子がよく使用される。
キーと値の区切りにハッシュロケット「=>」を使うが、キーが文字列かシンボルである場合はコロン「：」使う事が可能。

ハッシュロケットを用いた例 (文字列がキー)
`{"orange" => 300, "banana" => 100}`

よく使われているコロンを用いた例 (シンボルがキー)
`{orange: 300, banana: 100}`

ハッシュに格納されている値の取得は、ブラケット「[]」を使ってキーを指定する。

```ruby:get_key.rb
options = {orange: 300, banana: 100}
# 「100」と出力される
puts options[:banana]
```

ハッシュに新しく値を追加したい時や、既存の値を更新したい時は「[]=」を使う。

```ruby:add_key.rb
options = {orange: 300, banana: 100}
options[:raspberry] = 500
# 「500」と出力される
puts options[:raspberry]
```

ハッシュ内のキーと値を取得するにはそれぞれ「key」と「value」を用いる。
さらに、eachを使えばキーと値のペアを順次取得できる。

```ruby:get_hash.rb
options = {orange: 300, banana: 100}
options.each do |key, value|
   puts key
   puts value
end
```

- **initialize**：newメソッドでオブジェクトを生成する時は、そのオブジェクトのinitializeというメソッドが実行される。(newメソッド以外にallocateというメソッドでもオブジェクトを生成できるがその際、initializeメソッドは実行されない)

Userクラスを例とし、名前や住所等々オブジェクト生成時に設定し、それ以降は変更しない設定に変えている。オブジェクト設定時にインスタンス変数を設定する為にinitializeを利用している。

```ruby:user_initialize.rb
class User
  attr_reader :name, :address, :email 
  def initialize(name, address, email)
    @name = name
    @address = address
    @email = email
  end
end
```

initializeに引数をとるクラスのオブジェクト生成は、newに対応する引数を渡す。
`user = User.new("Taro", "東京都", nil)`

- **private**：メソッドの呼び出しに制限をかける事ができる。private と書かれた行以降に定義されたメソッドはオブジェクト内部からは利用できるが外側からは利用できない。

- **継承**
既存クラスが持つ機能を全て引き継いだ上で、一部を変えたいというニーズに適している。
機能を継承する元となるクラスを**「親クラスまたはスーパークラス」**と言い、逆に親クラスから見たときに自身を継承しているクラスを**「子クラスまたはサブクラス」**と言う。
継承を行うには、クラスを定義する際にクラス名の後に**「<」**を付けて、機能を継承するクラスを指定する。

```ruby:inheritance.rb
# Rails の Model でよく見るコード
# ApplicationRecord という Rails が用意したクラスを継承している
class User < ApplicationRecord
  # ...(省略)
end
```

- **モジュールによる共通化(Mix-in)**
ある一連の振る舞いの設計図を一箇所にまとめた存在としてモジュール(Module)という概念がある。
moduleキーワードを使って定義、クラスと同じ様にインスタンスメソッドを定義できる。
ただしモジュールはオブジェクトを生成できない。

```ruby:module.rb
# チャット能力
module Chatting
  def chat
   puts "Hey"
  end
end
```

クラスにモジュールを取り込むには**「include」**メソッドを使う。

```ruby:dog.rb
class Dog
  include Chatting
end
```

1つのクラスに対して複数のモジュールを取り入れることができる。

- **クラスメソッド**：クラスメソッドはメソッド名の前に**「self.」**を付けて定義する。

- **例外処理**：例外もオブジェクトである。
自分で例外を発生させるには**raise**メソッドを使う。
0除算の例

```ruby:raise.rb
raise ZeroDivisionError, "Wow, error!!"
# 実行すると以下が表示される
# Traceback ...(略)
# ...
# ZeroDivisionError (Wow, error!!)
```

raiseに文字列だけを渡すとRuntimeErrorを発生させる事ができる。

```ruby:runtimeError.rb
raise '例外発生!'
# 実行すると以下が表示される
# Traceback (most recent ...(略)
# ...
# RuntimeError (例外発生!)
```
特別な理由がなければStandardErrorを継承すると良い。

その他例外処理例

```ruby:err_ex1.rb
begin
   (例外が発生するかもしれないコード)
rescue
   (例外に対応するコード)
ensure
   (例外に関係なく必ず実行したいコード)
end
```

メソッド内の処理全体に対して例外処理を行いたい場合


```ruby:no_use_begin.rb
def メソッド名
  (メソッドのコード)
rescue
  (例外に対応するコード)
ensure
  (例外に関係なく必ず実行したいコード)
end
```


- **nilガード「||」**：変数にnilが入っているかもしれない状況で、nilの代わりに何らかのデフォルト値を入れておきたいという場面で利用する。

- **safe navigation operator(通称：ぼっち演算子)「&.」**
この演算子を使ってメソッドを呼び出すと、レシーバnilであった場合でもエラーが発生しなくなる。
&.の形が一人ぼっちで座っている絵の形に似ていることから「ぼっち演算子」と呼ばれる事が多くなってきたらしい。

以下、ifと三項演算子とぼっち演算子の簡潔記述例の比較

```ruby:comparison.rb
# ifを使った記述例
name = if object
  object.name
else
  nil
end

# 三項演算子を使った記述例
name = object ? object.name : nil

# ぼっち演算子を使った記述例
name = object&.name
```

- **%記法**：全ての要素が文字列である配列は「%w」というキーワードで記述できる。
また、全ての要素がシンボルである配列は、「%i」というキーワードで記述できる。
%記法を使う事で記述するコード量を少しでも減らす事ができ、可読性も高くなる。

```ruby:ex1.rb
# %wなし
ary1 = ["nakata", "taro", "riku"]
puts ary1 # => ["nakata", "taro", "riku"]

# %wあり
ary2 = %w(nakata taro riku)
puts ary2 # => ["nakata", "taro", "riku"]

# %iなし
ary1 = [:nakata, :taro, :riku]
puts ary1 # => [:nakata, :taro, :riku]

# %iあり
ary2 = %i(nakata taro riku)
puts ary2 # => [:nakata, :taro, :riku]
```

# Ruby入門 (後編) のまとめ
- **全部大事。以上。**

---

### 第2章へは[こちら](https://qiita.com/Hiro710/items/f8a034e0425e3d1a04ea)