#Ruby on Rails5速習実践ガイドchapter1
1-1-6 クラスとインスタンス(p.6)
・クラスとインスタンスの関係
クラスは親でインスタンスは子の関係になっており、クラスの中にたくさんのインスタンスが存在している。
例を出すと人間という大枠(クラス)の中にAさん(インスタンス)Bさん(インスタンス)Cさん(インスタンス)Dさん(インスタンス)が存在しているということになる。
1-2-5 ローカル変数とインスタンス変数の違い
種類 | 特徴 |
---|---|
ローカル変数 | その場限りの一時的な変数。定義したメソッド内でしか使うことができない |
インスタンス変数 | オブジェクトの保有する変数。インスタンス内で定義するとそのインスタンスないのどのメソッドにも利用できる |
例)
class MyClass
def method_1
@number=100
end
def method_2
@number #他のメソッド(method_1)で定義した@numberを別のメソッド(method_2)で利用できる
end
end
1-2-7 ゲッターやセッターを簡単に定義する(attr_accessor)の使い方
@nameなどのインスタンス変数をちゃんと使おうとすると次の2つを実行しなければならない。
1.作成した情報の名前(name)を@nameに代入して使えるようにするためのメソッドを定義する
2.@nameを表示させるためのnameメソッドを定義する
class User
def name=(name) #1.
@name = name
end
def name #2.
@name
end
ここまで来て初めて@nameを使えるメソッドが完成する。
...しかしめんどくさい。
class User
attr_accessor :name
end
attr_accessorを使うことによって一気にすっきりとした。
1-2-8 住んでいる場所やEメールアドレスを持たせる(attr_accessorの具体的な使い方)
attr_accessorには様々な属性をつけることができる
class User
atte_accessor :name, :address, :email
end
それぞれの属性を使いたい時は以下のようにする
user = User.new
user.name = "小田井優"
user.address = "東京"
def profile #名前と出身を表示させるメソッドを作った
"#{name}(#{address})"
end
user.profile #userの名前と出身をまとめて表示するprofileメソッドを実行した
=> "小田井優(東京)"
nameやaddressを使ってuserの情報を記入、呼び出しできる。
1-3-4-2 当てはまらない場合に分岐するunless (unlessの使い方)
ifは条件の結果が真だった時に処理を実行するがunlessは条件の結果が偽のときに処理を実行する。
(ifの逆の処理をする)
1-3-4-3 後置if
普段のifが後ろについた形。
else等はつけることができず1行だけに作用するif
puts 'おはようございます' if true #出力される
puts 'お疲れ様でした' if false #出力されない
上のコードは「もし結果がtrueならばputsを出力する」になる
結果はtrueなので「おはようございます」が出力される
##1-3-6 ハッシュ
普通の配列だと欲しいの値を出そうと思ったら番号(何番目か)を指定しなければならない。
これは配列の情報が多くなればなるほど不可能になっていく。
そこでハッシュを使い、値それぞれにあだ名(キー)みたいなものをつけていく。
そうすることであだ名を入力すれば自動的にそれに紐づいた値が出てくる。
jinnkou ={ tokyo: 13636222, kanagawa: 9145572 }
#{あだ名(キー):東京の人口,あだ名(キー):神奈川の人口}
puts jinnkou[:tokyo]
=> 13636222
[]の中には:を入れてあだ名(キー)をいれる
1-4-1 initialize
Rubyで「〇〇.new」を実行する時は必ず〇〇のクラスの中のinitializeが実行される。
テーブルのカラムに対応する値を入れれるようにする
例えばname,address,emailカラムがあるUserテーブルに新しい情報を入れる時、
initialize(name, address, email)と書くと、「カッコの中の1番目が名前、2番目が住所、3番目がメアドに対応させるよ」といった操作をする
class User #User.newのときにinitializeが使える
def initialize(name, address, email)
@name = name
@address = address
@email = email
end
end
user = User.new("大場寧子","東京都","nil")
# || || ||
#initialize( name ,address, email)
1-4-2 メソッドの呼び出しに制限をかける(private)
セキュリティ面により誰もがメソッドを使えると個人情報の流失等の問題になってしまうためprivateメソッドを使って外からメソッドを使えないようにする。
1-5-2 モジュールによる共通化(Mix-in)
規模の小さいメソッド(処理が一つだけだったり処理自体が簡単だったり)をモジュールとしてひとかたまりにし、様々なクラスで使えるようにする。
#価格についてまとめたモジュール
module PriceHolder
def total_price
price*Tax.rate
end
end
class Product
include PriceHolder
attr_accessor :price
end
class OrderedItem
include PriceHolder
attr_accessor :unit_price, :volume
#税抜き単価*数量
def price
unit_price*volume
end
end
価格に消費税率をかけて戻り値を出す処理をPriceHolderモジュールとして、そのPriceHolderモジュールをそれぞれのクラスに使っている。モジュールを使う時はincludeを使う。
1-7-1 nilガード
number ||=10
もしもnumberがあればnumberを使い、なければnumberに10を代入したnumberが使われる。
1-7-2 ぼっち演算子 &.
例えばUserテーブルはあるがobject.nameとコードを打っても、まずobjectテーブルがないのでエラーが表示される。しかしぼっち演算子object&.nameを使うとテーブルがない場合はエラーではなくnilを戻り値として返すようになる。
1-7-3 %記法
ary1 = ['apple', 'banana' ,'orange']
# %記法を使うと
ary1 = %w[apple banana orange]
%記法を使うと’’などが省略できる。
1-7-4 配列の各要素から特定の属性だけを取り出す(mapメソッド)
class User
attr_accessor :name, :address
end
user1 = User.new(name:'大場寧子', address:'東京都')
user2 = User.new(name:'小芝美由紀', address:'千葉県')
user3 = User.new(name:'小田井優', address:'神奈川県')
users = [user1,user2.user3]
この時、それぞれのuserの名前だけの配列が欲しい場合は、mapメソッドを使い
names = users.map(&:name)
=>["大場寧子","小芝美由紀","小田井優"]
このように 元の配列.map(&:欲しい情報) とすると欲しい情報だけの配列ができる。
その他勉強になったことメモ
1.require:ソースコード(ここではuser.rb)を読み込む時に使う
> require './user.rb'
2.returnを使うタイミング
メソッドを実行した時に返ってくる値のことを「返り値」という。基本的にメソッドは実行されると何かしらの返り値をくれるが、返り値をくれるのはメソッドが全て実行し切った時になる。メソッドの途中で返り値が欲しい場合はreturnを使い返り値を取得する。