回答:
この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
がそれがそうであったように説明することは、カジュアルな読者にとって危険ですmap!
map
、select
およびeach
私のコードでRubyの主力の一つです。
これにより、配列の各オブジェクトに対して操作を実行し、それらをすべて同じ場所に返すことができます。例としては、数値の配列を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
上では、列挙要素(ハッシュ、配列)のセットが含まれている、あなたはそうのようなあなたのブロックパイプ内のこれらの要素のそれぞれを宣言することができます。
[["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
オブジェクトであり、ハッシュは、インタプリタ用の特別な指示を持つタプルの配列です)。最初の「パイプパラメータ」はキー、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
がハッシュであると仮定すると、これはそれをマッピングする最善の方法です。1つではなく2つのブロックパラメーターを使用して、ハッシュ内の解釈された各タプルのキーと値のペアをキャプチャします。
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
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
メソッドを配置する前に、メソッドを配置するクラス内で宣言したように聞こえます
関数を「Enumerable
この場合は範囲」の各項目に「マップ」します。したがって、0からparam_count
(整数のみ-ドットについては正しい)の整数ごとに1回渡されたブロックを呼び出し、各戻り値を含む配列を返します。
これはのドキュメントですEnumerable#map
。また、エイリアスもありcollect
ます。
Range#map
実際には配列に変換します。
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}
マップは、ブロックパラメーターによって返される配列を反復処理する値を提供します。
#each
#each
配列内の各要素に対して関数を実行します。次の2つのコードの抜粋は同等です。
x = 10
["zero", "one", "two"].each{|element|
x++
puts element
}
x = 10
array = ["zero", "one", "two"]
for i in 0..2
x++
puts array[i]
end
#map
#map
配列の各要素に関数を適用し、結果の配列を返します。以下は同等です。
array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]
newArray = []
array.each{|element|
newArray << element.capitalize()
}
#map!
#map!
に似て#map
いますが、配列を変更します。以下は同等です。
array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
map
シーケンスの値を変換するために使用されるEnumerableオブジェクトにある一般的な「関数型」メソッドです(特別な考慮事項があります)。..
や...
範囲を作成する方法です。また、REPLについても理解してください。REPLを自分で試すことができます。:)