私はプログラミングが初めてです。誰かが.map
が何をするのか説明することができます:
params = (0...param_count).map
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
は、私のコードにおけるRubyの主力の1つです。
配列の各オブジェクトに対して操作を実行し、それらをすべて同じ場所に返すことができます。例として、数値の配列を1つ増やすことがあります。
[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
またはmap
を実行している Enumerable オブジェクトに一連の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
Hash(やはりEnumerable
オブジェクト)の場合、Hashは単にインタプリタのための特別な命令を持つタプルの配列です。最初の "pipeパラメータ"がキー、2番目が値です。
{: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
がハッシュであると仮定すると、これをマッピングするのに最適な方法です。ハッシュ内の各解釈されたTupleのキーと値のペアを取得するには、1つではなく2つのブロックパラメータを使用します。
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
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}
0..param_count
は「param_countまで」を意味します。 0...param_count
は、「param_countまでを含み、それを含まない」という意味です。
Range#map
はEnumerable
を返さず、実際にはそれを配列にマップします。 Range#to_a
と同じです。
関数をEnumerable
(この場合は範囲)の各項目に "マップ"します。そのため、0からparam_count
までのすべての整数に対して1回渡されたブロックを呼び出し(ドットについては排他的です)、各戻り値を含む配列を返します。
これはEnumerable#map
のドキュメントです。 エイリアスcollect
もあります。
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は、ブロックパラメータによって返される配列を反復する値を提供します。