LoginSignup
10
10

More than 5 years have passed since last update.

Ruby書いててあれ、これどうなるんだっけってなったやつら

Last updated at Posted at 2016-02-14

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)

しかし、これらが微妙にやっかい。

delete_if.rb
h = {a: 10, b: 20, c: 30}

h.delete_if {|k, v| v < 20}

p h
#=>{b: 20, c: 30}

delete_ifはレシーバを破壊する。

reject.rb
h = {a: 10, b: 20, c: 30}

h.reject {|k, v| v < 20}

p h
#=>{a: 10, b: 20, c: 30}

rejectはレシーバを破壊しない。
しかし、rejectはbangがある。

reject_bang.rb
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

これからどんどん見つけたら追加します〜

10
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10