Ruby基礎まとめ① （変数、条件分岐、繰り返し、ハッシュ、メソッド）

##はじめに
Progateで学習したRubyの内容を自分なりにまとめておく。

##Hello World
基本的に`puts`を用いて処理結果を表示していく

```Ruby
puts "Hello Ruby"
```

##文字列と数値
数字を取り扱う場合は以下のような違いがある

```ruby
puts 3 + 5  # 8
puts "3 + 5"  # 3 + 5

# 文字列の連結
puts "私は" + "Diggy-MO'です." # 私はDiggy-MO'です.
```

##変数
####変数の宣言
変数の宣言、変更などのルールは大体他言語と同じ

```ruby
text = "Piscineはつら楽しい" # 変数の宣言
puts "42tokyoの" + text

length = 8
width = 9
puts length * width
puts "--------------"

length += 5 # 変数の変更
puts length * width
```

####変数を文字列に含める場合
`"文字列 #{変数名} 文字列"`
""(ダブルクォーテーション)で囲む必要あり
''(シングルクォーテーション)だと、`#{変数名}`という文字列として扱われてしまう
数値と文字列の単純な連結 `puts age + "歳です"` はできない

```ruby
length = 9
width = 8
area = length * width
puts "面積は#{area}です"
```

####単語の命名規則
`snake_case `: 単語の間をアンダーバーでつなぐ命名規則

##配列
```ruby
# 変数名 = [値1, 値2, 値3, ...]
languages = ["日本語", "英語", "スペイン語"]

puts languages[1]
puts "#{languages[0]}を話せます"
```

##条件分岐
###if, else

```ruby
# 書式
if 条件1
  条件1が成立する(true)時の処理
elsif 条件2
  条件2が成立する時の処理
else
  どの条件も成立しない時の処理
end
```

- A以上(>= A)
- Aではない(!= A)
- AかつB(A && B)

などの条件の書き方も他言語と同様

```ruby
number = 48

if number % 3 == 0 && number % 5 == 0
  puts "FizzBuzz"
elsif number % 5 == 0
  puts "Buzz"
elsif number % 3 == 0
  puts "Fizz"
else
  puts number
end
```

##繰り返し処理
###each

```ruby
# 書式
配列.each do |変数名|
  処理
end
```

####変数のスコープ
繰り返し処理(each)の中で使った変数は、eachの中でしか使えない。

```ruby
languages = ["日本語", "英語", "スペイン語"]
border = "---------------------" # 変数のスコープ

languages.each do |language| # languageはeachの中でしか使えない
  puts border
  puts "#{language}を話せます"
end
# puts language <- エラー
```

##ハッシュ
それぞれの値にキーを設定して管理する。

```ruby
# 書式
{"キー1" => 値1, "キー2" => 値2, ...}
```


####通常のハッシュ
キーの値の変更や追加などもできる

```ruby
exam = {"subject" => "Math", "score" => 80}

puts exam["subject"] # キーの値を出力
exam["subject"] = "Science" # キーの値を変更
puts exam["subject"]

exam["grade"] = "good" # 新しいキーと値の追加
puts exam["grade"]
```

####シンボル
文字を`""`や`''`の代わりに先頭に`:`をつけた書き方

```ruby
# {:キー1 => 値1, :キー2 => 値2, ...}
# {キー1: 値1, キー2: 値2, ...} (省略形)
# 変数名[:キー] で呼び出し(省略形でも呼び出し方は同じ)

exam = {:subject => "Math", :score => 80}
exam = {subject: "Math", score: 80} # この2つ同じ

puts "#{exam[:subject]}: #{exam[:score]}点"
```

####nil

>`nil` は何かが存在しないことを表すために用いられるオブジェクト

`nil`に関しては、コメントで紹介して頂いた以下の記事から引用させて頂いた。

https://qiita.com/scivola/items/da2480ca4597a7dcf73d


```ruby
exam = {subject: "Math"}

if exam[:score] 
  puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
else # 存在しないキーを指定すると、nil(false)となる
  puts "#{exam[:subject]}の結果は分かりません"
end
```

####要素がハッシュである配列
```ruby
# 変数名 = [
#   {キー1: 値1, キー2: 値2},
#   {キー1: 値1, キー2: 値2},
# ]

characters = [
  {name: "にんじゃわんこ", age: 14},
  {name: "ひつじ仙人"},
  {name: "ベイビーわんこ", age: 5},
  {name: "とりずきん"}
]

characters.each do |character|
  puts "--------------------"
  puts "名前は#{character[:name]}です"
  if character[:age]
    puts "年齢は#{character[:age]}歳です"
  else
    puts "年齢は秘密です"
  end
end
```

##メソッド
```ruby
# 書式
ド名(引数)
  処理
  return 戻り値
end
メソッド名(引数)  # メソッドの呼び出し
```

####通常のメソッド
```ruby
def price_with_shipping(price)
  if price >= 5000
	  return price
  end
	return price + 500
end

puts "商品の合計金額は3000円です"
puts "お支払い金額は、送料込みで#{price_with_shipping(3000)}円です"
puts "-----------"
puts "商品の合計金額は10000円です"
puts "お支払い金額は、送料込みで#{price_with_shipping(10000)}円です"
```

####キーワード引数
```ruby
# def メソッド名(引数1:, 引数2:, 引数3:, ...)
#   処理
#   return 戻り値
# end
# メソッド名(引数1: 値1, 引数2: 値2, 引数3: 値3, ...)

def buy(item:, price:, count:)
	puts "#{item}を#{count}台のお買い上げです"
	puts "合計金額は#{price * count}円です"
end

buy(item:"テレビ", price:15000, count:2)
```

##おわりに
次回はクラスとインスタンスについてまとめようと思う。