Rubyのmap、each、collect、map!、collect!秘密を暴く

2431 ワード


def map_method
  arr1 = ["name2","class2"]
  arr2 = arr1.map {|num| num + "and"}
  print "map............",arr2,"
" end def each_method arr1 = ["name2","class2"] arr2 = arr1.each {|num| num + "and"} print "each............",arr2,"
" end def collect_method arr1 = ["name2","class2"] arr2 = arr1.collect {|num| num + "and"} print "collect............",arr2,"
" end def map1_method arr1 = ["name2","class2"] arr2 = arr1.map! {|num| num + "and"} print "map!............",arr2,"
" end def collect1_method arr1 = ["name2","class2"] arr2 = arr1.collect! {|num| num + "and"} print "collect!............",arr2,"
" end def test map_method each_method collect_method map1_method collect1_method end test

result:
map............["name2and", "class2and"]
each............["name2", "class2"]
collect............["name2and", "class2and"]
map!............["name2and", "class2and"]
collect!............["name2and", "class2and"]
eachの使い方をより明確に理解するために、次の例を見てみましょう.

def each_deep_method
  arr_test = [1,2,3]
  arr_result = arr_test.each do |num|
    num = num + 1
    p num
  end
  arr_result
end

result:
2
3
4
=> [1, 2, 3]
表示each_deep_methodの戻り値arr_resultはarr_testは等しい.
[まとめ]
(1)eachは配列の各要素を遍歴するだけで、新しい配列を生成しない.
(2)mapとcollectは同じ使い方で、各要素を遍歴し、処理後の要素で新しい配列を構成し、新しい配列を返す.
(3)map!同じcollect!
そのうちmapとmap!、collectとcollect!の違いは葛藤しなくてもいいでしょう.本当に葛藤しているのは次の例を見てみましょう.

def map_deep_method
  arr_test = [1,2,3]
  arr_test.map do |num|
    num += 1
  end
  arr_test  #[1, 2, 3]
end

def map1_deep_method
  arr_test = [1,2,3]
  arr_test.map! do |num|
    num += 2 
  end
  arr_test  #[3, 4, 5]
end