map
в основном перебирает элементы объекта:
foo = [
['a', 'b'],
['c', 'd']
]
foo.map{ |ary| puts ary.join(',') }
# >> a,b
# >> c,d
В этом примере он передает каждый подмассив, который назначен ary
.
Если посмотреть на это немного иначе:
foo.map{ |ary| puts "ary is a #{ary.class}" }
# >> ary is a Array
# >> ary is a Array
Поскольку Ruby позволяет нам присваивать несколько значений одновременно, это можно было бы написать так:
foo.map{ |item1, item2| puts "item1: #{ item1 }, item2: #{ item2 }" }
# >> item1: a, item2: b
# >> item1: c, item2: d
Если map
выполняет итерацию по массиву хэшей, каждая итерация дает вложенный хеш для блока:
foo = [
{'a' => 1},
{'b' => 2}
]
foo.map{ |elem| puts "elem is a #{ elem.class }" }
# >> elem is a Hash
# >> elem is a Hash
Если map
выполняет итерацию по хешу, каждая итерация возвращает пару ключ/значение в блок:
foo = {
'a' => 1,
'b' => 2
}
foo.map{ |k, v| puts "k: #{k}, v: #{v}" }
# >> k: a, v: 1
# >> k: b, v: 2
Однако, если вы дадите блоку только один параметр, Ruby присвоит переменной и ключ, и значение, так что вы увидите ее как массив:
foo.map{ |ary| puts "ary is a #{ary.class}" }
# >> ary is a Array
# >> ary is a Array
Таким образом, вы должны знать о множестве вещей, которые происходят, когда вы перебираете контейнер и когда Ruby передает значения в блок map
.
Помимо всего этого, важно помнить, что map
будет возвращать значение или значения для каждой переданной вещи. map
, также известный как collect
, используется для преобразования значений. Его не следует использовать в качестве замены each
, который выполняет только итерацию. Во всех приведенных выше примерах я не показал правильное использование map
, потому что пытался показать, что происходит с переданными элементами. Обычно мы делаем что-то вроде:
foo = [['a', 'b'], ['c', 'd']]
foo.map{ |ary| ary.join(',') }
# => ["a,b", "c,d"]
Or:
bar = [[1,2], [3,4]]
bar.collect{ |i, j| i * j }
# => [2, 12]
Также есть map!
, который изменяет итерируемый объект, а не возвращает значения. Я бы порекомендовал избегать map!
до тех пор, пока вы не поймете, почему это может быть вам полезно, потому что, похоже, это бесконечно сбивает с толку людей, если они не понимают, как передаются переменные и как работают массивы и хэши.
Лучше всего играть с map
в IRB. Вам будет легче увидеть, что происходит.
person
the Tin Man
schedule
18.07.2014