Я новичок в программировании. Может кто-нибудь объяснить, что .map
будет делать в:
params = (0...param_count).map
ruby
map
range
enumeration
bigpotato
источник
источник
map
является общим «функциональным» методом, который можно найти в перечисляемых объектах, используемых для преобразования значений в последовательности (с особыми соображениями)...
и...
способы создания диапазонов. Кроме того, ознакомьтесь с REPL, где вы можете попробовать этот материал самостоятельно! :)Ответы:
map
Метод принимает перечислимый объект и блок, и запускает блок для каждого элемента, каждый вывод возвращаемого значения из блока (исходный объект не изменяется , если не используетсяmap!)
:Array
иRange
перечислимые типы.map
с блоком возвращает массив.map!
мутирует исходный массив.Где это полезно, и в чем разница между
map!
иeach
? Вот пример:Выход:
источник
map
как если бы это былоmap!
map
вместе сselect
иeach
является одной из рабочих лошадок Руби в моем коде.Это позволяет вам выполнить операцию над каждым из объектов вашего массива и вернуть их все в одном месте. Примером может быть увеличение массива чисел на единицу:
Если вы можете запустить один метод для элементов вашего массива, вы можете сделать это в стиле сокращения следующим образом:
Чтобы сделать это с приведенным выше примером, вы должны сделать что-то вроде этого
Чтобы проще использовать технику быстрого доступа, давайте рассмотрим другой пример:
Преобразование данных в Ruby часто включает каскад
map
операций. Изучитеmap
&select
, они являются одними из самых полезных методов Ruby в основной библиотеке. Они так же важны, как иeach
.(
map
также является псевдонимом дляcollect
. Используйте то, что лучше всего подходит для вас концептуально.)Более полезная информация:
Если объект Enumerable, на котором вы работаете
each
илиmap
на котором находится, содержит набор элементов Enumerable (хэши, массивы), вы можете объявить каждый из этих элементов внутри ваших блочных каналов следующим образом:В случае Hash (также
Enumerable
объекта, Hash - это просто массив кортежей со специальными инструкциями для интерпретатора). Первый «параметр трубы» - это ключ, второй - значение.Чтобы ответить на актуальный вопрос:
Предполагая, что
params
это хеш, это будет лучший способ отобразить его: используйте два параметра блока вместо одного, чтобы захватить пару ключ-значение для каждого интерпретируемого кортежа в хэше.источник
NoMethodError: private method 'plusone' called for 1:Fixnum
в ruby 2 и «неправильное количество аргументов» в ruby 1.9 / 1.8. Во всяком случае, я использовал лямбда:plusone = ->(x) { x + 1 }
затем вынуть символ спецификатора:[1,2,3].map(&plusone)
.private
внутри класса, где вы помещаете свой метод перед тем, как поместить свой методИспользуя ruby 2.4, вы можете сделать то же самое, используя
transform_values
эту функцию, извлеченную из рельсов в ruby.источник
0..param_count
означает "до и включая param_count".0...param_count
означает "до, но не включая param_count".Range#map
не возвращаетEnumerable
, фактически отображает его в массив. Это так же, какRange#to_a
.источник
Он «сопоставляет» функцию с каждым элементом в
Enumerable
- в данном случае, диапазоне. Таким образом, он будет вызывать блок, переданный один раз для каждого целого числа от 0 доparam_count
(исключая - вы правы насчет точек), и возвращать массив, содержащий каждое возвращаемое значение.Вот документация для
Enumerable#map
. У него также есть псевдонимcollect
.источник
Range#map
самом деле преобразует его в массив.Enumerable
, как каждая. Я думал, что это сделал.Карта является частью перечислимого модуля. Очень похоже на «собирать» Например:
Карта предоставляет значения, повторяющиеся в массиве, которые возвращаются параметрами блока.
источник
#each
#each
запускает функцию для каждого элемента в массиве. Следующие два фрагмента кода эквивалентны:#map
#map
применяет функцию к каждому элементу массива, возвращая полученный массив. Следующее эквивалентно:#map!
#map!
это как#map
, но изменяет массив на месте. Следующее эквивалентно:источник