Rubyの基礎~わかりにくいところ復習~

###オブジェクト

オブジェクトとは、Rubyで扱うデータのことを指します。
文字列オブジェクトでは文字を扱います。
文字をダブルクォーテションまたはシングルクォーテーションで囲むことによって文字列になります。つまりそれを文字列オブジェクトと言います。
文字列オブジェクトの他にも、時刻オブジェクトや、日付オブジェクト、配列オブジェクト、数値オブジェクトなどもあります。

| オブジェクト名    　 |     扱うもの 　　　　　|   
|:----------------|:------------------:|
| 文字列オブジェクト   |   文字　　　　　　 　| 
| 配列オブジェクト     |  複数のデータ     |   
| 数値オブジェクト     |   数値　　　　  　 |      
| 時刻オブジェクト     |  時間    　　　 　 |  
| 日付オブジェクト    　|   日付　　　　　  |       



###メソッド


メソッドとは、プログラミングにおける何らかの処理をする命令群のことです。
例えば、ターミナルに文字列オブジェクトを出力したい時には`puts`メソッドを使います。

オブジェクトを別のオブジェクトに形を変えるメソッドもあります。
例えばlengthメソッドです。このメソッドは文字列メソッドに使えるメソッドで文字列メソッドを自身の文字数の値を数値メソッドに変換します。
to_sメソッドは数値メソッドを文字列メソッドに変換してくれます。

###返り値
返り値とは、オブジェクトや、メソッドが処理されたあとの最終的な値のことです。
Rubyのオブジェクト自体、メソッドを利用した式には必ず返り値があります。

つまりlengthメソッドを使ったときは、文字列の文字数の値の数値を返り値として返します。
to_sメソッドは数値オブジェクトを、文字列オブジェクトに変換して、それを返り値として返します。
to_iメソッドは文字列オブジェクトを数値オブジェクトに変換してくれます。

- オブジェクト単体の返り値はそのオブジェクト自体を返します。
- 計算式はその式の答えが返り値として返ります。
- メソッドを利用したときはその処理の実行結果が返り値として返ります。
 - しかしputsメソッドは返り値として`nil`を返します。空という意味です。出力と返り値は別です。
- 代入式は格納した値（代入した値）自体が返り値です。

getsメソッドはユーザーが入力した値の文字列オブジェクトを返り値として返します。
getsメソッドは、末尾に改行がついて返り値として返してしまいます。バックスラッシュ記法の`\n`がついた状態です。
それを取り除くには`chomp` メソッドを使います。このメソッドを使うと新たに`\n`を取り除いた状態の文字列オブジェクトを返してくれます。

###比較演算子

==　は左右の式や値が等しい時にtrueを返り値として返します。等しくないときはfalseを返します。
それとは逆に
!= では左右の値が等しくない時にtrueを返し、等しい時にfalseを返します。


###変数

変数とはオブジェクトの入れ物のようなもので、その入れ物に名前がついています。
変数にオブジェクトを格納することができるのです。
変数は最代入が可能で値を更新することができます。
それに対して、定数は最代入が原則として禁止で、かつ全て大文字で書くのが慣習です。
つまり、固定した値を格納したい時に定数を使います。



###ハッシュ
ハッシュは変数の一つで、複数のデータを持つことができるオブジェクトです。
値をキーで管理しています。このペアで保存する形式のことをキーバリューストアと言います。
ハッシュオブジェクトのキーには文字列オブジェクトとシンボルオブジェクトが使えます。
実行速度がシンボルオブジェクトの方が速いので、シンボルオブジェクトが推奨されます。
シンボルオブジェクトは名前を識別するためのラベルのようなものでほぼほぼ文字列オブジェクトと同義で使えます。

```index.rb
hash = {}　　　　　　　　　##空のハッシュを生成

hash[:name] = "taro"　　##値の代入
hash[:age] = 20　　　　　##値の代入

puts hash[:name]  　　　##値の取得

```

###自分で定義するメソッド
putsのような処理を自分で定義してメソッド化することができます。
同じコードを何度も書かなくて済みますし、コードの可読性も上がります。また。修正や管理もしやすくなります。

定義は　　defの隣に任意のメソッド名を書いてendまでの間に実行した処理を記述します。

```index.rb
def my_name
　puts "私の名前は太郎です。"
end
```
注意しなければならないのはメソッドの定義部分はそのメソッドが呼びだれるまで読み込まれません。
ですのでメソッド名が呼び出される前は定義部分はスルーされます。

```index.rb
def my_name　　　　　　　　　##次にここが読まれる。それまではスルー。
　puts "私の名前は太郎です。"
end

my_name                   ##メソッドの呼び出し　最初にここが読まれる
```

###while文
同じ処理を繰り返すことができる文法です。

```index.rb
while 条件式　do
#処理
end
```

条件式の部分がtrueであるかぎり処理を何回も繰り返します。

つまり

```index.rb
while true　do
#処理
end
```
だと無限ループでプログラムを終了させなくできます。

処理の中にexitメソッドを使えば特定の時に無限ループを止めることができます。


###配列
配列とは配列オブジェクトのことです。ハッシュがキーでオブジェクトを管理していたのに対して、配列は順番で管理します。配列にはハッシュも入れることができます。
順番の管理は０から始まるので、１つ目に入れた要素は0で管理されます。
配列オブジェクトに要素を追加するときは`<<`メソッドを使います。
配列の数を数えたいときはlengthメソッドを使います。


###変数のスコープ
変数にはその変数が使える範囲というものが決まっています。
通常はメソッド内では。そのメソッド内で定義された変数しか使用することができません。
メソッド外で定義された変数を使うには引数を使います。


###引数
メソッドを呼び出す部分に書く引数を本引数と言います。
また、メソッドを定義している部分に書く引数を仮引数と言います。
本引数と呼び出したい変数は同じ名前である必要がありますが、本引数と仮引数は同じでなくて構いません。
仮引数で設定した名前でメソッド内で変数を使えます。

```index.rb
def age_sister(age)

puts "my sister is #{age} years old."
return age 　　　 ##putsメソッドは返り値としてnilを返してしまうのでreturn文で変数の値を返り値として返している

end

sister = 25 　　　##age_sisterメソッドのスコープ外に変数sisterが定義されている。
age_sister_and_me(sister) 　　　##age_sisterメソッドを呼び出す部分で本引数に変数sisterを取っている。
```

`return`文はそこで返り値が確定するのでそこで処理が終了する。
定義されたメソッドの返り値は最後に記述された式の値が返ります。


```index.rb
def animal_name(name)
 puts "この動物は#{name}です。"
 return "僕は#{name}!"
end

puts animal_name("犬")
```

上記のような場合、animal_nameメソッドでreturn文が使われているので返り値として"僕は犬！"が返ります。
putsメソッドで 僕は犬！ が出力されています。
メソッドの呼び出し側で定義された("犬”)はメソッド内で変数として使うことができます。今回で言うと変数nameとして使えるようになっています。

引数は関数を呼び出す際にどんなことを出力させるか決めるために利用される。
メソッドは引数を渡すと何かを返してくれる。
メソッドが引数を受け取るときその名前は何でも良い。
メソッドの最後で、メソッドの呼び出し元に値を返すときは`return`を使います。


###eachメソッド
eachメソッドとは繰り返しのためのメソッドです。
配列オブジェクトにeachメソッドを使うと、その配列の要素の数だけ繰り返し処理が行われます。