264

私はプログラミングに不慣れです。誰かが何をするか説明できますか.map

params = (0...param_count).map
4

8 に答える 8

448

この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
于 2012-08-23T04:01:29.317 に答える
69

map、と一緒にselecteach私のコードで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操作が必要です。Study mapselect、これらはプライマリライブラリで最も便利なRubyメソッドの一部です。それらはと同じくらい重要ですeach

mapの別名でもありcollectます。概念的に最も効果的なものを使用してください。)

さらに役立つ情報:

実行中または実行中のEnumerableオブジェクトに一連のEnumerable要素(ハッシュ、配列)が含まれている場合は、次のようにブロックパイプ内でこれらの各要素を宣言できます。eachmap

[["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
于 2013-10-11T16:56:05.627 に答える
8

それを視覚化する必要がある人のために:

マップ方法の例を視覚的に説明

何もしない地図

さらに少ない地図

ビッグバンでマップ!

これが完全な話です:

https://richstone.io/rubys-map-collect-methods-explained-visually/

于 2021-03-30T10:46:02.580 に答える
6

transform_valuesruby 2.4を使用すると、レールからRubyに抽出されたこの機能を使用して同じことを行うことができます。

h = {a: 1, b: 2, c: 3}

h.transform_values { |v| v * 10 }
 #=> {a: 10, b: 20, c: 30}
于 2016-12-08T16:52:47.160 に答える
4

0..param_count「param_countまで」を意味します。 0...param_count「最大、ただしparam_countを含まない」を意味します。

Range#mapを返しませんEnumerable。実際には配列にマップします。と同じRange#to_aです。

于 2012-08-23T03:57:04.333 に答える
3

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

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

于 2012-08-23T03:56:02.173 に答える
2

マップは列挙可能なモジュールの一部です。「収集」と非常によく似ています。例:

  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}

マップは、ブロックパラメータによって返される配列を反復処理する値を提供します。

于 2016-09-16T21:46:50.643 に答える
2

#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()}
于 2020-03-09T22:42:13.473 に答える