# 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メソッド