Вопрос по range, map, enumeration, ruby – Что делает метод «карта» в Ruby?
Я новичок в программировании. Может кто-нибудь объяснить, что.map
будет делать в:
params = (0...param_count).map
map
является общим «функциональным» метод, найденный в перечисляемых объектах, используемый для преобразования значений в последовательности (с особыми соображениями)...
а также...
способы создания диапазонов. Также,get familiar с REPL, где вы можете попробовать это самостоятельно! :)
map
, вместе сselect
а такжеeach
это одна из рабочих лошадок Ruby в моем коде.
Это позволяет вам выполнить операцию с каждым из объектов вашего массива и вернуть их все в одном месте. Примером может быть увеличение массива чисел на единицу:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
Если вы можете запустить один метод для элементов вашего массива, вы можете сделать это в стиле сокращения следующим образом:
To do this with the above example you'd have to do something like this
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
To more simply use the ampersand shortcut technique, let's use a different example:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
Преобразование данных в Ruby часто включает каскадmap
операции. Изучениеmap
& Амп;select
они являются одними из самых полезных методов Ruby в первичной библиотеке. Они так же важны, какeach
.
(map
также псевдоним дляcollect
, Используйте то, что лучше всего подходит для вас концептуально.)
More helpful information:
Еслиперечислимый объект, который вы запускаетеeach
или жеmap
on содержит набор элементов Enumerable (хэши, массивы), вы можете объявить каждый из этих элементов внутри ваших блочных каналов следующим образом:
[["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
object, Hash - это просто массив кортежей со специальными инструкциями для интерпретатора). Первый «параметр трубы» ключ, второе значение.
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
To answer the actual question:
При условии, чтоparams
является хэшем, это лучший способ отобразить его: используйте два параметра блока вместо одного, чтобы получить ключ & amp; пара значений для каждого интерпретируемого кортежа в хэше.
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
private
внутри класса, где вы положили свой метод, прежде чем положить свой метод
NoMethodError: private method 'plusone' called for 1:Fixnum
в ruby 2 и «неверное количество аргументов» в рубине 1.9 / 1.8. Во всяком случае, я использовал лямбду:plusone = ->(x) { x + 1 }
затем возьмите спецификатор символа:[1,2,3].map(&plusone)
.
Например:
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
Метод принимает перечислимый объект и блок и запускает блок для каждого элемента, выводя каждое возвращаемое значение из блока (исходный объект остается неизменным, если вы не используетеmap!)
:
[1, 2, 3].
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
как будто это былоmap!
Enumerable
- в этом случае диапазон. Поэтому он будет вызывать блок, переданный один раз для каждого целого числа от 0 доparam_count
(исключая - вы правы относительно точек) и возвращаете массив, содержащий каждое возвращаемое значение.
Вот документация дляEnumerable#map
. У него также есть псевдоним,collect
.
Enumerable
как и у каждого. Я думал, что это сделал.
Range#map
на самом деле преобразует его в массив.