# ruby on rails 5 速習実践ガイド アウトプット 1
## <font color="MediumBlue">Chapter 1</font> rails のための ruby 入門
### 1-1 オブジェクトを理解しよう
#### 1-1-1 から 1-1-5 まで
* ruby , rails では たくさんのオブジェクトが存在している。
* オブジェクトは簡単にいうと『モノ』。
* 自分が望んだプログラム処理をするために、たくさんのオブジェクトを作ったり、使ったりしていく。
* オブジェクトは自分の型(クラス)を持っている。
* 数値や文字列もオブジェクト。オブジェクトの後に`.class`と書き込むと、オブジェクトが何者なのか(クラス)がわかる。
:::info
例:erbファイルに`"太郎".class`と書き込む。ターミナルで実行すると、`String`と返ってくる。<br>これは、`"太郎"`が`String`(文字列っていうクラスだよ)ということを返している。
:::
* オブジェクトは固有番号を持っている。
固有番号は変化するものと、不変のものがある。
:::info
例:文字列は変化。数字の1は『3』という固有番号をもつ。
:::
#### 1-1-6 クラスとインスタンス
* ruby のようなオブジェクト指向言語では、一般的に『オブジェクトXのクラスがAであるとき、XはAのインスタンス(オブジェクト)である。』という。
:::info
例1:`"氏名"`は Stringクラスのインスタンス(オブジェクト)
例2:`1` は Integerクラスのインスタンス(オブジェクト)
現実世界での例:`太郎`は人間という種の`一部`(人間の1人)
:::
#### 1-1-7 から 1-1-10
* オブジェクトの機能はクラスで決まっている。
* オブジェクトにいろんな処理をするには、`変数`を使う。
* 変数には、ローカル変数や、インスタンス変数がある。
* ローカル変数は、プログラムの中で一定の処理の範囲で使われ、その範囲が終わると捨てられる。
* インスタンス変数は、オブジェクト内部に保持されてオブジェクトが存在する限り一緒に存在する。
* rubyのローカル変数の名前はアルファベットの小文字かアンダースコア( _ )で始める。
:::info
例1:sample_message
例2:part2
例3:_user 等
:::
* オブジェクトの仕事(なんらかの振る舞いをすること)を『メソッド』という。メソッドを使って、いろんなプログラミング処理がかける。
### 1-2 自分でクラスを作ってみよう(ゲッター、セッター等)
* インスタンス変数の内容を参照するためのメソッドをゲッターと呼ぶ。
:::info
次のやり方の場合エラーが起こる。
```ruby=
class User
def initialize(name, age)
@name = name
@age = age
end
end
tanaka = User.new('田中太郎', 18)
tanaka.@age = 33
#=> syntax error, unexpected tIVAR, expecting '('tanaka.@age = 33
```
正しい書き方
```ruby=
class User
def initialize(name, age)
@name = name
@age = age
end
def name # ゲッターメソッド
@name # メソッドが呼び出されたら@nameを返す
end
def age # ゲッターメソッド
@age # メソッドが呼び出されたら@ageを返す
end
end
tanaka = User.new('田中太郎', 18)
p tanaka.name # nameメソッドを呼び出す
#=> "田中太郎"
p tanaka.age # ageメソッドを呼び出す
#=> 18
```
上記の`tanaka.name`のように、`name`というゲッターメソッド(読み取り専用のインスタンスメソッド)を経由することでインスタンス変数(@name)をクラスの外部から参照することが出来ている。
このゲッターメソッドは、参照したいインスタンス変数が増える度に定義する必要があるのでコード量が増えてしまう。
そこで、`attr_reader`メソッドを使えば、明示的に1つ1つのゲッターメソッドを定義する必要もなく以下の記述だけで済む。
```ruby=
class User
# この記述だけで各ゲッターメソッドが定義される
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
tanaka = User.new('田中太郎', 18)
p tanaka.name
#=> "田中太郎"
p tanaka.age
#=> 18
```
:::
* インスタンス変数を代入するためのメソッドをセッターと呼ぶ。
:::info
セッターメソッドは、以下のname=メソッドやage=メソッドのように、メソッドが呼び出された時に各インスタンス変数の値を変更するように定義する。
```ruby=
class User
def initialize(name, age)
@name = name
@age = age
end
def name=(name) # セッターメソッド
@name = name #メソッドが呼び出されたら@nameを引数の値に変更
end
def age=(age) # セッターメソッド
@age = age #メソッドが呼び出されたら@ageを引数の値に変更
end
end
tanaka = User.new('田中太郎', 18)
tanaka.age = 33 # age=メソッドを呼び出している
```
上記のコードの`tanaka.age = 33`によってage=というセッターメソッド(書き込み専用のインスタンスメソッド)を経由することでインスタンス変数(@age)をクラスの外部から変更することが出来ている。
age=となり、代入してそうに見えるが、メソッドを呼び出しているだけなのに注意!
ゲッターメソッド同様セッタメソッドも、`attr_writer`メソッドを使えば、明示的に1つ1つのセッターメソッドを定義する必要もなく以下の記述だけで済む。
```ruby=
class User
attr_reader :age # 変更を確認する為に追加
attr_writer :name, :age
def initialize(name, age, mail, cell)
@name = name
@age = age
end
end
tanaka = User.new('田中太郎', 18)
p tanaka.age # => 18
tanaka.age = 33
p tanaka.age # => 33 変更されている
```
:::
* attr_accessorメソッド
:::info
```ruby=
class User
attr_reader :name, :age, :mail, :cell # @mail,@cellをを追加
attr_writer :name, :age, :mail, :cell # @mail,@cellをを追加
def initialize(name, age, mail, cell)
@name = name
@age = age
@mail = mail
@cell = cell
end
end
tanaka = User.new('田中太郎', 18, 'hoge@example.com', '070-09xx-xxxx')
p tanaka.mail #=> "hoge@example.com"
tanaka.cell = '090-09xx-xxxx'
p tanaka.cell #=> "090-09xx-xxxx"
```
次のように、どちらのメソッドにも指定してるインスタンス変数名は一緒なので、参照・変更の両方を一気に定義したい場合
```ruby=
class User
# 各インスタンス変数のゲッター/セッターメソッドの両方が定義される
attr_accessor :name, :age, :mail, :cell
def initialize(name, age, mail, cell)
@name = name
@age = age
@mail = mail
@cell = cell
end
end
tanaka = User.new('田中太郎', 18, 'hoge@example.com', '070-09xx-xxxx')
p tanaka.mail #=> "hoge@example.com"
tanaka.cell = '090-09xx-xxxx'
p tanaka.cell #=> "090-09xx-xxxx"
```
:::
* 一般的にオブジェクトの抱えるデータのことを`属性`と呼ぶ。
* メソッドからメソッドを使う。
:::info
```ruby=
class User
attr_accessor :name, :email
def profile
"#{name}(#{email})"
end
end
```
```
> user = User.new
> user.name = "飯田"
> user.email = "iida@gmail.com"
> user.profile
=> "飯田(iida@gmail.com)"
```
profileのメソッド内でnameメソッドなどが使える。
:::
### 1-3 ruby プログラムの基礎知識
* rubyにおいて、nilとfalseが偽、それ以外は真になる。
* 後置ifの書き方。(単純な条件分岐でよく使われる)
:::info
例
```ruby=
puts `こんにちは` if true
```
:::
* 配列とハッシュ
:::info
配列 (ブランケット[] で囲まれる)
```ruby=
[1,2,3]
```
ハッシュ (波括弧 {} で囲まれる)
```ruby=
{ tokyo: 13636222, kanagawa: 9145572 } # よく使われる書き方
```
`:tokyo` のように:で始まる`シンボル`という書き方がある。
ハッシュに格納されている値を取得する場合
```ruby=
users = { name: 'iida', age: 20}
# 『iida』と出力される
puts users[:name]
```
ちなみに、ハッシュ内の全てのキーを取得するには`keys`全ての値を取得するには`values`どちらも取得するには`to_a`が使える。
:::
### 1-4 少しコードなテクニック
#### initialize メソッド
nitializeメソッドはclassがnewされた際に呼び出されるメソッドで、主にclassのデータの初期化処理を行う。
#### pravate メソッド
オブジェクト内部から利用できるが、外部からは不可。
#### 引数にデフォルト値とキーワード因数
### 1-5 似たところのあるクラスを作りたいとき
#### 継承
#### モジュールによる共通化
### 1-6 プログラムの異常を検知しよう
### 1-7 読めると便利! ruby っぽい書き方
#### nilガード
#### ぼっち演算子 &.
#### %記法
#### mapメソッド