Rubyについて（基礎）

# 最初に
自身で学習してきた内容を書き出していきます。
基本的には自分自身でわかるような内容になりますので、ご容赦ください。
また、誤っている点がありましたら、コメントにてご指摘ください。

**（要確認）**マークがあるものは、「実行前に必ずググる」べき内容。



# index
- 基本文法
 - Hello, World!
 - データ型について
- オブジェクトとメソッド
  - オブジェクトとは
  - メソッドとは
- 変数と定数
  - 変数とは
  - 定数とは
- データ型
  - 数値（**0除算について**）
  - 文字列
  - 配列
  - ハッシュ
  - シンボル 
- 条件分岐
  - if文
  - 比較演算子
  - 論理演算子
  - elsif、else
- 繰り返し処理
  - 文字列や数字をキーボードから入力する方法
     - gets
     - to_i
  - 繰り返し処理や要素を順に取り出す処理
     - while文
     - for文
     - each文
     - break

〜主な流れ〜

```terminal:ターミナル
$ touch xxx.rb # ターミナルコマンドでからファイルを作成、ここに処理を記述していく
$ ruby xxx.rb  # 実行
$ # 結果
$ # 記述した処理がここに出る
```
以後は省略。



# 基本文法
## Hello, World!

```ruby:
puts 'Hello, World!'
# 結果
Hello, World!
```



## データ型について
文字列型（String「""」）と整数型（Integer「　」）がよく使われる。
**詳しくは後日、投稿予定。**

```ruby:
puts 5 + 3
puts "5 + 3"
puts "5" + "3"

# 結果
8     # 両方integerなので、「５＋３」の計算結果
5 + 3 # 計算式をstringで囲っているので、「文字としての"5+3"」が表示される結果
53    # 文字列と文字列を足しているので、「文字としての"5"と"3"」が連続して表示される結果
```

**同じ見た目のメソッドでも、中身が異なる場合があるが、めちゃくちゃ便利。**


## 文字列型、整数型の型変換
```ruby:
to_s 
27.to_s  # 数字→文字へ変換,この場合は文字列型の２７になる

to_i
"27"to_i # 文字→数字へ変換,この場合は整数型の２７になる
```



# オブジェクトとメソッド
## オブジェクトとは
操作対象の状態（データ）と便利な機能（メソッド）を1つにまとめたもの
オブジェクトは「～～のもの」

## メソッドとは
オブジェクトが持っている固有の機能や処理のこと
メソッドは「～～するもの」 

## つまり・・・？
```ruby:
puts "XXXYYYY".length
# 結果
7 # 「文字列オブジェクト」を「lengthメソッドで文字数を数え」、結果を「出力（puts）」
```
他にも、「reverse（文字列を逆にする）」メゾットや、「include?（引数に指定した文字列が含まれているか）」メゾットなどがある。
（メソッドが使えるのかを一覧表示したい場合は、使用可能なメソッド一覧を表示できる「methods」メソッド）
include?の場合は、「true（真）」か「false（偽）」で結果が表示される。



# 変数と定数
## 変数とは
オブジェクトにつける名札。
名札をつけることで、欲しいデータを呼び出すことが用意になる。
ただし、**変数名は小文字で始まるルール**があり、尚且つ**数字は使えない**。

```ruby:
test = "テストコメントが表示されることを確認しよう"
puts test
# 結果
テストコメントが表示されることを確認しよう
```

**変数名　=　入れたいデータ**
ポイント　：　「=」は数学的な等しいという意味ではなく、「**右のオブジェクトを左の変数に代入する**」という意味。

## 定数とは
あらかじめ変更しないことが保証された数値やデータにつける名札。
基本的に**大文字で始まる**。
**⚠️値を書き換えることができない点に注意⚠️**
（warning（実行不可能なエラーではないが非推奨な使い方）が表示されて書き換えができてしまうが、エラーが出る時点でアウト。）

```ruby:
Xx = 3.14
puts Xx
# 結果
3.14
```

```ruby:
Pi = 3.14
puts Pi
 
Pi = 100
puts Pi
# 結果
3.14
pi.rb:4: warning: already initialized constant Pi
pi.rb:1: warning: previous definition of Pi was here
100 
```



# データ型
## 数値
「1」「100」「-100」「0」などの整数や、「3.14」などの小数のこと
メソッドとしては、+（足し算）、-（引き算）、/（割り算）、*（掛け算）、%（割り算の余りの計算）などの四則演算。

```ruby:
puts 100 
# 結果
100

puts 100 + 5
# 結果
105
```

ポイント　：　0除算について
任意の数字　を0で割ってはいけないという数学的ルールがプログラミングにも適用されるぞ。
詳しくは後日投稿予定。
[[四則演算注意点] 数字を0で割ってはいけないプログラム計算式](http://wordpress.ideacompo.com/?p=12783)


## 文字列
シングルクォートやダブルクォートで囲むことで、文字列として出力。
文字列の中に#{変数}と記述することによって、｛｝内の変数の値を展開可能。
+を使うと、文字列の連結も可能になり、文字列同士だけでなく、文字列と変数、または変数同士でも、連結できる。

```ruby:
puts "Rubyを学習"
# 結果
Rubyを学習

name = "テストさん"
puts "Hello" + name
# 結果
Helloテストさん

puts "こんにちは#{name}"
# 結果
こんにちはテストさん
```

## 配列
配列を使うと、複数のデータをまとめて保存できる。
配列の各要素には、どのようなオブジェクトでも代入でき、同じ配列の要素に異なった種類のオブジェクトを代入することも可能。
しかも、データ型は問われず、文字列でも数値でも代入できる。
ただし、先頭から0、1、2というように「インデックス番号」が割り振られ、「**0**」から開始することに注意。

```ruby:
names = ["Ruby", "Java", "Python", "PHP"]
puts names[1]
 
# 結果
Java
```

ポイント　：　たまにeach文で回したデータを**array（からの箱的な感じ）**に突っ込んだりする。


## ハッシュ
ハッシュは、キーと値をセットで保存できるデータの集合。
配列では各要素にインデックス番号が割り振られるが、ハッシュでは任意の値（キー）を割り振ることができる。

```ruby:
tall = {"あい"=>185, "うえ"=>170, "お！"=>150}
puts tall["あい"]
# 結果
185
```

## シンボル
シングルクォートやダブルクォートの代わりにコロンを使用することで、文字列と同様に扱うことが可能。

```ruby:
tall = {:かき=>185, :くけ=>170, :こ！=>150}
puts tall[:こ！]
# 結果
150 
```



# 条件分岐
## if文
**「もしAならばBを実行し、AでなければCを実行」**
条件に当てはまればtrue、当てはまらなければfalseという真偽判定ができる。

```ruby:
apple = 110
 
if apple >= 100
    puts "りんごの値段は100円以上です" #true=>処理される
end
 
if apple <= 100
    puts "りんごの値段は100円以下です" #false=>処理されない
end

# 結果
りんごの値段は100円以上です            # apple = 110のためtrue処理になった
```

## 比較演算子
「条件を比較して判定する」時に使用する記号とかのこと。

```ruby:
<    # 右辺の方が大きい
<=   # 右辺の方が大きい、または等しい
>    # 左辺の方が大きい
>=   # 左辺の方が大きい、または等しい

# 数値だけでなく、文字列の比較（同じ文字列かどうか）でも利用できる
==   # 右辺と左辺が等しい
!=   # 右辺と左辺が等しくないとき
```

## 論理演算子
「2つ以上の条件を判定する」時に使用する。

```ruby:
!    # 否定
&&   # どちらの条件も正しければtrue
||   # どちらかの条件が正しければtrue 
 
tall = 180
if tall >= 170 && tall <= 190
    puts "身長は170以上190以下です。"
end
# 結果
身長は170以上190以下です。
```

## elsif、else
if（もし〜）文では、elsif(それとも〜)やelse（当てはまらないなら〜）を使うことで、ifの条件に当てはまらなかった場合の処理を設定できる。

### else

```ruby:
apple = "A"
 
if apple == "A" # もしappleがAなら 
    puts "それはAのリンゴです"
else # ifが当てはまらない場合は
    puts "そのリンゴはAではないです"
end
# 結果
A typeのリンゴです
```

### elsifとelse

```ruby:
apple = "B"
 
if apple == "A" # もしappleがAなら
    puts "そのりんごはAです"
elsif apple == "B" # それともappleがBなら
    puts "そのりんごはBです"
else # どちらも当てはまらない場合は
    puts "そのりんごはCです"
end
# 結果
そのりんごはBです
```
よくFizzBuzz問題としてここあたりが使われると思う。



#繰り返し処理
全て１００％覚える必要はないが、**処理ごとの特徴**くらいは覚えよう。

## 文字列や数字をキーボードから入力する方法
### gets
**キーボード入力された値を取得するメソッド。**
getsを使うと、キー入力待ちの状態になり、文字を入力してEnterキーを押すまで次に進まない。
文字列として返されるぞ。

### to_i
**文字列を整数に変換するメソッド。**
例えば、getsメゾットにto_iを使って文字列（String）を整数（Integer）に変換すると計算ができる。

```ruby:
puts "キーボードで数字「2」と数字「3」を入力してください"
  a=gets.to_i
  b=gets.to_i
  puts "a+b=#{a+b}"
# 結果
a+b=5
```

## 繰り返し処理や要素を順に取り出す処理
### while文
繰り返し処理を行いたいときに使用し、**指定した条件式が真（true）の間、繰り返し実行される**のが特徴。

```ruby:
while　条件　do # 条件がtrueの間
    処理 # 処理を繰り返す
end
```

```ruby:
# サイコロを振って「6」が出るまで繰り返し実行
dice = 0 # diceに0を代入し、初期値を設定
while dice != 6 do # サイコロの目が6ではない間、diceの初期値は0なので条件を満たす。
                   # 以降はdiceに代入される数によって結果が異なる
    dice = rand(1..6) # 1～6の数字がランダムに出力
    puts dice    
end
# 結果
4
2
1
~
6 # サイコロを振って「6」が出るまで繰り返し実行された最後の数字として６で繰り返し処理が止まる
```

### for文
繰り返し処理を行いたいときに使用し、**指定したオブジェクトから順に値を取り出しながら繰り返される**のが特徴。

```ruby:
for 変数 in 範囲、ハッシュ、配列などを指定 do
    処理
end

# for ～ end内で、1から10まで順番に表示する処理を繰り返す実行
for i in 1..10 do # 1..10は、1～10までの範囲を表す
    puts i
end
# 結果
1
2
3
~
9
10 # 1から10まで順番に表示されるため１０で止まる
```

### eachメソッド
オブジェクト内の要素を順に取り出すメソッド。
個人的に一番使う繰り返し処理。
繰り返し処理を行いたいときに使用し、**データの先頭から順に繰り返して処理される**mのが特徴。

```ruby:
（範囲、ハッシュ、配列などを指定）.each do |変数|
  実行する処理
end
```

```ruby:
apple： 130
strawberry：180
orange：100
という結果が欲しいと仮定

{"apple"=>130, "strawberry"=>180, "orange"=>100}.each do |fruit, price| 
# ハッシュの内容を順にキーをfruit、値をpriceに代入して繰り返す
 puts "#{fruit}は#{price}円です。" # 変数展開
end
# 結果
appleは130円です。
strawberryは180円です。
orangeは100円です。
```

地味にポイントなのが、|fruit, price|のように、左から入っていく。
さらに付け加えると、平均点を求める際にも使える。

```ruby:xxx_controller.rb
ratesum = 0 # 初期値は0
    movie_comments.each do |comment| # movie_commentsを繰り返し、1つ1つをcommentとする
      ratesum += comment.rate # 初期値0に対して、comment.rateという数字を存在するだけ、足し算し続ける
    end

# @averageに平均点を代入
# movie_comments.length（配列の要素数を取得）した時、0なら0,0ではなかったら計算して欲しい処理をしてもらう
    @average = movie_comments.length == 0 ? 0
    : ratesum / movie_comments.length
# comment.rateを足し続けた数字に対して、存在する配列の要素数で割ることで、平均点を割り出す。
```

### break
**繰り返し処理を中断する**ことができる。
whileやfor、eachなどの繰り返し文の中で利用する。

```ruby:
i = 0
while i <= 10 do
 if i >5
   break # iが5より大きくなると繰り返しから抜ける
 end
 puts i
 i += 1
end

# 結果
0
1
2
3
4
5
```



# 追加あれば、どんどん更新していきます。
駆け出しとして頑張ります。