JT's Blog

Do the right things and do the things right.

Ruby Map / Collect / Each

| Comments

Map / Collect

一般來說,會把這兩個視為同一種功能,也有說法是map 是collect 的別名

stackoverflow 有針對 map 和 collect 做 benchmark,使用 map 效能會比較好

map 和 collect 是屬於 Enumerable Module 的 methods

map 和 collect 會回傳新的 array,而 array 內的值是 block 執行的結果

Array、Hash 都有include enumerable module,就可以使用map 和 collect

1
2
3
4
5
6
7
8
# Array
[1,2,3].map {|x| x + 1 }
# => [2, 3, 4]

# Hash
hash = {:name => "John", :age => 30, :phone => "0910111000"}
hash.map {|key, value| value }
# => ["John", 30, "0910111000"]

& 是 #to_proc 簡化的符號

在Rails 中,假設要取得所有User 的姓名,使用 map 的寫法如下

1
2
names = User.all.map{ |user| user[:name] }.compact
# compact: Returns a copy of self with all nil elements removed.

承上,簡化 user[:name],可以使用& 執行 #to_proc,就變成&:name

stackoverflow 有更詳細的說明

1
2
# 取值
names = User.all.map(&:name)

使用 String#upcase

1
2
3
4
5
6
# 轉大寫
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]

# equivalent to
%w(vanessa david thomas).map { |s| s.upcase }

跟 each 差別在哪呢?

看完 map, collect 感覺跟一般常用的 each 很像,那他們的差別在哪邊呢?

首先 Array、Hash 都有各自實作 #each

執行的方式,跟執行 block 的動作是一樣的

主要差別在 each 是回傳self (Array、Hash),而map 和 collect 回傳 new array

Reference

Comments