Rubyの基礎を知ろう

## はじめに
今までJavaScriptを中心に学んできたが、Rubyを学習し初めた。
かなり基礎的

学習するバックエンドにRubyを選んだ理由: 圧倒的独学のしやすさ。

## 変数

```rb
sample = 1
sample2 = 'あああ'
```

## 配列
```rb
languages = ["日本語", "英語", "スペイン語"]
```

## ハッシュ(オブジェクト)
```rb
# 文字列での書き方
{"name" => 値1, "age" => 値2}

 # 「シンボル」の書き方 
{:name => 値1, :age => 値2}

# 省略したシンボルの書き方　一般的
{ name: "Suzuki", age: 21 }

puts sample[:name] # ハッシュはこの参照方法
```

## ハッシュのループ
変数が1つではなく2つになる

```rb
arr = {key1: "Ruby", key2: "PHP"}
arr.each do |key, val|
  p "#{key}は#{val}です"
end
# key1はRubyです
# key2はPHPです
```

## 条件分岐
大元のif以外endが必要ないのがポイント

```rb
if 条件式
  処理1
elsif 条件式
  処理2
else
  処理3
end
```

## 繰り返し
**each**

```rb
# each 
languages = ["日本語", "英語", "スペイン語"]

languages.each do |language|
  put "#{language}を話せます"
end
```

```rb
#ハッシュが値の配列を、繰り返す
exams = [
  {subject: "Math", score: 80},
  {subject: "Science", score: 55}
]

exams.each do |exam|
  puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
end
```

---

**for**

```rb
for文
for i in 0 .. 4
  p i
end

# forのネスト to_sで数字を文字列にする
for i in 0 .. 2
  for j in 0 .. 2
    p i.to_s + "-" j.to_s
  end
end

# 条件に配列を指定
arr = [2,4, 6,8,10]

for i in arr do
  p i

```

---

## メソッド
**通常のメソッド**

```rb
# 引数にデフォルト値を設定
def introduce(name="田中")
  
  p "#{name}です"
  
end

# 呼び出し
introduce
```
---

 **真偽値を返すメソッドの場合メソッド名の最後に?をつける慣習**
 returnは処理を終わらせる役割もある

```rb
def negative?(number)
  return number < 0
end

puts negative?(5)
```
---

## 例外処理

```rb
def calc_tax(i)
  ## 数値でなければエラーを発生させる
  fail("数値を指定してください") unless i.instance_of?(Integer) i * 1.1
end
p calc_tax("あ") # ここでエラー終了
p calc_tax(1) # この行は実行されない
```

## 例外をキャッチする

```rb
def calc_tax(i)
  fail("数値を指定してください") unless i.instance_of?(Integer) i * 1.1
end

begin
  # beginの中で発生した例外はキャッチされる(捕まえられる)
  p calc_tax("あ") # 例外発生!rescueへ飛ばされる
  p calc_tax(1) # この行は実行されない!
rescue => e # キャッチされた例外はeとしてここにやってくる
  p e.message # エラーメッセージを表示する (failの引数の内容)
  p e.backtrace # どこでエラーが発生したかを表示する
end
p calc_tax(2) #この行は実行される
```

## 例外を再び投げる
デバッグの際などend以降を実行したくない場合に使えそう

```rb
# fail()...例外を発生させる時
# raise() ..　キャッチした例外を再び投げる時
begin
  p calc_tax("あ")
rescue => e
  p e.message
  p e.backtrace
  
  raise e # 例外をrescueの外へ投げる
end
p calc_tax(2) # この行は実行されない
```

## module
`module名をsample.rbとする`
`require "./sample"`で読み込み

## 入力を受け付ける
```rb
puts "名前を入力してください"

# 変数 = gets.chompで入力した値を変数に代入して使う
name = gets.chomp

puts "あなたの名前は#{name}です"
```

```rb
# gets.chompは文字列を扱うため、数字を扱う場合は変換する
name = gets.chomp.to_i

# getsもある。入力したところで改行が入る
name = gets
```

## 日付を使う
```rb
require "date"

date1 = Date.new(2021, 7, 31)
puts date1 # 2014-07-31

# Dateクラスには様々なメソッドがある。(クラスメソッド)
puts date1.sunday? #sundayかを判定する

date1 = Date.tody #今日の日付のインスタンス
puts date1
```

## putsとprint
```rb
puts 'aa' # 改行して出力
p 'bb' # pで省略できる

print 'rb' # 改行せずに出力
```

## 暗黙的なreturn
rubyでは最後に処理した値を暗黙的に戻り値とする

```rb
def calc(i)
  i + 2
end

# returnがないが、暗黙的に最後に処理した値が返っている
p calc(1) # 3
```

## break

```rb
# ある条件に当てはまった時に処理を止める
# break if i == 3の一行で表せる
for i in 0 .. 4
  if i == 3
    break
  end
  p i
end
```

## next

```rb
# ある条件に当てはまった時にスキップさせる
for i in 0 .. 4
 next if i == 3
  p i
end
```

## unless
ifの逆。 falseなら実行される

```rb
unless age >= 20
  p "未成年です"
end

# iが数値でなければ、数値ではありませんを出力
p "数値ではありません" unless i.instance_of?(Interger)
```

## キーワード引数を持つメソッド
**あまり使われない**
1: 定義側で、引数の後に「:」をつける
2: 呼び出し側で、値の前に引数名を書く

```rb
def introduce(name:, age:)
  
  puts "私は#{name}です"
  puts "年齢は#{age}です"
  
end

## キーワード引数利用時の呼び出し方
introduce(name:"にんじゃわんこ", age:14,)
```

## 可変長引数
複数の値を配列で受け取る

```rb
def price(*1)
  p i #[1, 2, 3]
end

price(1,2,3)
```

## オプション引数
1つの引数で複数の値をハッシュで受け取る

```rb
def price(**1)
  p i # {item1: 100, item2: 200}
end

price(item1: 100, item2: 2002)
```

---
---
---
## 例外処理系の続き



## ensureで絶対実行
raiseで例外を外に出しても実行されるっぽい？

```rb
begin
  p calc_tax("あ")
rescue => e
  p e.message
ensure
  p "例外は発生してもしなくても最後に実行される"
end
```


## 特定エラーのキャッチ

```rb
def div(i)
  fail("数値を指定してください") unless i.instance_of?(Integer)
  1 / i # i=0 だと ZeroDivisionErrorが発生
end

begin
  p div(0)
rescue ZeroDivisionError => e # 0を入れた時はここに飛ぶ
  p "0では割り算できません"
rescue => e
  p e.message # ここには来ない
end
```

## メソッド全体の例外をキャッチ

```rb
def div(i)
  1 / i
rescue => e
  # メソッドの例外をキャッチ
end
```

##　終わりに
rubyを学んでみて感じたことがある、バックエンドとフロントエンドで違いはあれど、１つの言語を学習したとに別の言語
を学習するとかなり楽だ。
JavaScriptでも 条件 && 条件 && 条件の書き方がある。
左から条件の判定を始めてTRUEであれば右に移る。途中でFALSEがあれば、その時点での値を返すなど、共通する部分は多い

そしてもう一つ。 Ruby楽しい 設計思想？が楽しくコーディングできるようになので尚更ですね。

今回はProgateとYoutubeしか使っていないが、購入した書籍で学んで行く予定
[購入した書籍はこちら(楽しいRuby)](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-Informatics-IDEA-%E9%AB%98%E6%A9%8B/dp/4797399848/ref=sr_1_1?keywords=%E6%A5%BD%E3%81%97%E3%81%84Ruby&qid=1640159669&sr=8-1) 

## 参考
[Progate](https://prog-8.com/dashboard)
[Youtube1](https://www.youtube.com/watch?v=0DO5bsQB5So)
[Youtube2](https://www.youtube.com/watch?v=8NI57SrDiVw&t=2s)