0

私はrubymonk.comのインタラクティブなチュートリアルに従っていて、ラムダを始めたばかりです。ラムダはかなりよく理解していると思いますが、このコードでは少し迷っています。

1  def with_names(fn)
2   result = []
3   [ ["Christopher", "Alexander"],
4     ["John", "McCarthy"],
5     ["Joshua", "Norton"] ].each do |pair|
6       result << fn.call(pair[0], pair[1])
7   end
8   result
9  end
10  l = lambda { |first_name, last_name| "#{first_name} #{last_name}" }
11  with_names(l)

[3行目と5行目の間に入力された名前は]配列またはハッシュに保持されていますか?私の理解では、それらは配列のハッシュであり、 `.each do |pair|を呼び出すときに ハッシュ内の各配列を反復処理していますが、これは正しいですか?6行目の次のコード:

result << fn.call(pair[0], pair[1])

各配列要素を結果配列にプッシュしていると思いますが、このコードがどのように機能するかは正確にはわかりません。特に、この部分は、ブロックを通過する各配列のインデックス位置にあるデータをプルしているだけfn.callだと思います。(pair[0], pair[1])ここで何が起こっているのかを明確に説明していただければ幸いです。もうすぐそこにいると思います。ありがとう。

4

2 に答える 2

2

[3 行目の 1行目と 5 行目の間に入力された名前は]、配列またはハッシュに保持されていますか?

名前の文字列は配列に保持され、そのすべてが別の「マスター」配列に含まれています。「マスター」配列をループすると、その要素 (つまり、["Christopher", "Alexander"]など) が呼び出しに続くブロックに渡されeachます。


では、関数に渡されるラムダは、2 つの引数 (反復fn.call(pair[0], pair[1])によって提供される姓と名) で呼び出されます。eachこのラムダは何らかの値を返すと想定されています。この場合、ラムダは連結された文字列を返すため、式は部分的に次のように評価されます。

result << "Christopher Alexander"

ここから、<<オーバーロードされた演算子は、右側のオペランドを左側のオペランド (配列) にプッシュする必要があることを示します。

于 2012-05-14T18:48:05.473 に答える
1

3行目の最初の[と5行目]の間に入力された名前は、配列またはハッシュに保持されていますか?

これは配列の配列です。つまり、配列の各要素は、2 つの文字列を含む別の配列です。そう

result.first
=> ["Christopher", "Alexander"]

ラムダは、2 つの引数を取り、それらを文字列としてフォーマットするメソッドです。

`.each do |pair| を呼び出すとき ハッシュ内の各配列を繰り返し処理していますが、これは正しいですか?

説明したように、ここにはハッシュはありません。単純に配列を反復処理しており、各要素自体が 2 つの要素 (名と姓) を持つ配列になっています。 resultラムダメソッドの戻り値が入ります。

于 2012-05-14T18:47:48.423 に答える