web-dev-qa-db-ja.com

"map"メソッドはRubyで何をするのですか?

私はプログラミングが初めてです。誰かが.mapが何をするのか説明することができます:

params = (0...param_count).map
237
Edmund

mapメソッドは、列挙可能なオブジェクトとブロックを受け取り、各要素に対してブロックを実行して、ブロックから返される各値を出力します(元のオブジェクトは、map!)を使用しない限り変更されません)。

[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]

ArrayRangeは列挙型です。ブロック付きの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
419
Danil Speransky

mapselectおよびeachは、私のコードにおけるRubyの主力の1つです。

配列の各オブジェクトに対して操作を実行し、それらをすべて同じ場所に返すことができます。例として、数値の配列を1つ増やすことがあります。

[1,2,3].map {|x| x + 1 }
#=> [2,3,4]

あなたがあなたの配列の要素に対して単一のメソッドを実行することができるならば、あなたはそのように速記スタイルでそれをすることができます:

  1. 上記の例でこれを行うには、次のようにする必要があります。

    class Numeric
      def plusone
        self + 1
      end
    end
    [1,2,3].map(&:plusone)
    #=> [2,3,4]
    
  2. より簡単にアンパサンドのショートカット手法を使用するには、別の例を使用しましょう。

    ["vanessa", "david", "thomas"].map(&:upcase)
    #=> ["VANESSA", "DAVID", "THOMAS"]
    

Rubyでデータを変換することはしばしばmap操作のカスケードを含みます。 mapselectを調べてください。これらは、プライマリライブラリで最も有用なRubyメソッドのいくつかです。それらはeachと同じくらい重要です。

mapcollectの別名でもあります。概念上、自分に最適なものをすべて使用してください。)

より役に立つ情報:

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
61
boulder_ruby

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}
5
tokhi

0..param_countは「param_countまで」を意味します。 0...param_countは、「param_countまでを含み、それを含まない」という意味です。

Range#mapEnumerableを返さず、実際にはそれを配列にマップします。 Range#to_aと同じです。

4

関数をEnumerable(この場合は範囲​​)の各項目に "マップ"します。そのため、0からparam_countまでのすべての整数に対して1回渡されたブロックを呼び出し(ドットについては排他的です)、各戻り値を含む配列を返します。

これはEnumerable#mapのドキュメントです。 エイリアスcollectもあります。

3
Ry-

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は、ブロックパラメータによって返される配列を反復する値を提供します。

2
gkstr1