なにこれ
筆者がチェリー本を読んだ時のメモをまとめた記事です。
ぼっち演算子「&.」
変数(レシーバー)がnilだった場合はnilを返して、nilじゃなければ右辺の処理を実行する
変数に値がある or nilか確定できない時に使うと簡潔に書ける。
user = ‘suga’
p user&.upcase #=> SUGA
user = nil
p user&.upcase #=> nil
ちなみにそのままnilにupcaseメソッドを使うと下記のエラーが出る
user = nil
p usesr.upcase
undefined method `upcase' for nil:NilClass (NoMethodError)
# NoMethodError:NilClassのnilオブジェクトにupcaseメソッドは定義されてません
rubyは配列の最後にカンマをつける文化らしい
jsonとかとは違って厳密に管理しないから、配列の最後にカンマをつけるみたい。
「カンマつけるかどっちでも良い=じゃあつけよう!」みたいな感じですかね。
array = [
'hoge',
'fuga',
'piyo',
]
**でハッシュを展開する
h={hoge: 'hoge', piyo: 'piyo'}
p a = { fuga: 'fuga', **h } #=> {:fuga=>"fuga", :hoge=>"hoge", :piyo=>"piyo"}
配列を順番に処理する時、「&:method」を使う
内部にprocをつかうことで引数にブロックを取れる
a = ['a','b','c']
p a.map(&:upcase)
nilが渡される可能性のある配列は、Array(users)みたいにArrayクラスを定義して、引数に変数を渡せば処理できる。nilの場合は[ ]
が返る
||=
railsとかのソースコードでよく見るこれ。毎回忘れるので備忘録として書きます。
下記は全て同じ意味。省略して書けるのがメリットです。
test = nil
p test ||= 'hoge' #=> ‘hoge’
p obj.foo #=> nil
p obj.foo || (obj.foo = true) #=> true
test = nil
if test.nil?
p 'hoge'
else
p test
end #=> ‘hoge’
test = 'fugaaaaaaaaaaaa’
p test ||= 'hoge’ #=> ‘fugaaaaaaaaaaaa’
test = 'fugaaaaaaaaaaaa’
if test.nil?
p 'hoge'
else
p test
end #=> ‘fugaaaaaaaaaaaa’
any?メソッド
一つ以上条件が満たせばtrueを返す
array_and_nil = [1, 2, nil, nil, 5]
p array_and_nil.any?(&:nil?) #=> true
require 'active_support/all'
hoge = nil
def piyo(hoge)
hoge || return
end
piyo(hoge) #=> nil
2重for文を避けられる。でも使い所が難しそう
tx = %w(1 2 3 4 5)
ty = %w(a b c d e)
for point in tx.product(ty)
p(point)
end
&:
下記みたいなコード。渡すブロックを省略できる。
これができる条件
1.ブロック引数が1個だけ
2.ブロックの中で呼び出すメソッドには引数がない
3.ブロック引数にメソッドを1回呼び出す以外の処理がない
n=[1,2,3,4,5,6]
n2=n.select(&:even?)
attr_accessor
呼び方は、個人的にアトリビュートアクセッサーって読んでる。
周りの人はアクセッサーって言ってるかも
役割は、端的に言うと下記のコードを1行で書ける
def name
@name
end
def name=(name)
@name = name
end
上の6行のコードが次の1行になる
attr_accessor :name
インスタンスからクラスメソッドを呼び出す方法
self.class.【クラスメソッド】
すればおk
class User
def self.self_
p 'self'
end
def instance_
self.class.self_
end
end
a = User.new
a.instance_ #=> 'self'
既存のメソッドのエイリアスを作成した後にメソッドを上書き➡️prepend?
特定のオブジェクトだけに結びつくのが、特異メソッド(シングルトンオブジェクトとも言う)
hoge = 'hoge'
def hoge.hello
p 'hoge!'
end
hoge.hello #=> 'hoge!'
includeはモジュールのメソッドをインスタンスから呼べるようにする。
extendはクラスメソッドにする