Что делает метод "карта" в Ruby?
Я новичок в программировании. Может кто-нибудь объяснить, что .map будет делать:
params = (0...param_count).map
6 ответов:
The
mapметод принимает перечисляемый объект и блок и запускает блок для каждого элемента, выводя каждое возвращенное значение из блока (исходный объект не изменяется, если вы не используетеmap!):[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
ArrayиRangeявляются перечислимыми типами.mapС блоком возвращает массив.map!изменяет исходный массив.где это полезно, и в чем разница между
map!иeach? Вот пример:names = ['danil', 'edmund'] # here we map one array to another, convert each element by some rule names.map! {|name| name.capitalize } # now names contains ['Danil', 'Edmund'] names.each { |name| puts name + ' is a programmer' } # here we just do something with each elementвывод:
Danil is a programmer Edmund is a programmer
mapвместе сselectиeachэто одна из рабочих лошадок Руби в моем коде.это позволяет запустить операцию на каждом из объектов вашего массива и вернуть их все в том же месте. Примером может быть увеличение массива чисел на единицу:
[1,2,3].map {|x| x + 1 } #=> [2,3,4]если вы можете запустить один метод на элементах вашего массива, вы можете сделать это в сокращенном стиле, например:
чтобы сделать это с приведенным выше примером, вам нужно будет сделать что-то вроде этого
class Numeric def plusone self + 1 end end [1,2,3].map(&:plusone) #=> [2,3,4]чтобы более просто использовать технику амперсанд ярлык, давайте использовать другой пример:
["vanessa", "david", "thomas"].map(&:upcase) #=> ["VANESSA", "DAVID", "THOMAS"]преобразование данных в Ruby часто включает в себя каскад
mapоперации. Исследованиеmap&select, они являются одними из самых полезных методов Ruby в основной библиотеке. Они так же важны, какeach.(
mapтакже является псевдонимом дляcollect. Используйте все, что работает лучше всего для вас принципиально.)более полезная информация:
если перечисли объект, который вы запускаете
eachилиmapon содержит набор перечислимых элементов (хэши, массивы), вы можете объявить каждый из этих элементов внутри ваших блочных каналов следующим образом:[["audi", "black", 2008], ["bmw", "red", 2014]].each do |make, color, year| puts "make: #{make}, color: #{color}, year: #{year}" end # Output: # make: audi, color: black, year: 2008 # make: bmw, color: red, year: 2014в случае хэша (также
Enumerableобъект, хэш-это просто массив кортежей со специальными инструкциями для интерпретатора). Первая " труба параметр" - это ключ, второй-значение.{:make => "audi", :color => "black", :year => 2008}.each do |k,v| puts "#{k} is #{v}" end #make is audi #color is black #year is 2008ответить на актуальный вопрос:
предполагая, что
params- это хэш, это был бы лучший способ отобразить его: используйте два параметра блока вместо одного, чтобы захватить пару ключей и значений для каждого интерпретируемого кортежа в хэше.params = {"one" => 1, "two" => 2, "three" => 3} params.each do |k,v| puts "#{k}=#{v}" end # one=1 # two=2 # three=3
0..param_countозначает "До и включая param_count".0...param_countозначает "До, но не включая param_count".
Range#mapне возвращаетEnumerable, он фактически отображает его в массив. Это то же самое, чтоRange#to_a.
С помощью ruby 2.4 вы можете сделать то же самое с помощью
transform_values, эта функция извлекается из rails в ruby.h = {a: 1, b: 2, c: 3} h.transform_values { |v| v * 10 } #=> {a: 10, b: 20, c: 30}
он "отображает" функцию для каждого элемента в
Enumerable- в данном случае диапазон. Таким образом, он будет вызывать блок, переданный один раз для каждого целого числа от 0 доparam_count(эксклюзив - вы правы насчет точки) и возвращает массив, содержащий возвращаемое значение.вот документация для
Enumerable#map. он также имеет псевдоним,collect.
карта является частью перечисляемого модуля. Очень похоже на "сбор" например:
Class Car attr_accessor :name, :model, :year Def initialize (make, model, year) @make, @model, @year = make, model, year end end list = [] list << Car.new("Honda", "Accord", 2016) list << Car.new("Toyota", "Camry", 2015) list << Car.new("Nissan", "Altima", 2014) p list.map {|p| p.model}Map предоставляет значения, повторяющиеся через массив, которые возвращаются параметрами блока.