rubyでプログラミングしてて、あれ、これどうなるんだっけってなったもの達をメモしていきます。
1, ブロックの外とブロック変数で同じ名前の変数を使う
例えば、以下は、出力は3になる。
num = 0
3.times do
num += 1
end
p num
しかし、これはどうだろう
num = 0
3.times do |num|
num += 1
end
p num
これは結果は0になる。ブロック変数numと外のnumは別物として理解される。
2, rangeのドットが3つ
下の2行、どうなるだろう。
p (1..3).to_a
p (1...3).to_a
結果は、
# => [1,2,3]
# => [1,2]
ドット3つでレンジオブジェクトを作ると、最後の要素を含まない。
ActiveRecordでこれを使うとbetweenで最後の要素を取得しないクエリーを作るときに便利です。
3, Hash#delete_if とHash#reject
2つとも、ブロックを受け取ることで、trueを受け取った要素を削除するメソッド。(それぞれ反対にあるメソッドは、keep_if, select)
しかし、これらが微妙にやっかい。
h = {a: 10, b: 20, c: 30}
h.delete_if {|k, v| v < 20}
p h
# =>{b: 20, c: 30}
delete_ifはレシーバを破壊する。
h = {a: 10, b: 20, c: 30}
h.reject {|k, v| v < 20}
p h
# =>{a: 10, b: 20, c: 30}
rejectはレシーバを破壊しない。
しかし、rejectはbangがある。
h = {a: 10, b: 20, c: 30}
h.reject! {|k, v| v < 20}
p h
# =>{b: 20, c: 30}
つまり、
delete_if = reject!
keep_if = select!
delete_if、keep_ifはそれだけで破壊的、rejectとselectは!をつけて破壊的になる。
4, ブロックを渡すメソッドの引数のカッコ省略
do end はカッコ省略可能、 {}はカッコ省略できない。
[1,2,3].inject 0 do |i, e| i + e * 2 end
# => 12
[1,2,3].inject 0 { |i, e| i + e * 2 }
# => error
これからどんどん見つけたら追加します〜