5
def reverse(ary)
  result = []
  for result[0,0] in ary
  end
  result
end

assert_equal ["baz", "bar", "foo"], reverse(["foo", "bar", "baz"])

これは機能し、その理由を理解したいと思います。説明はありますか?

4

2 に答える 2

10

eachの代わりにこれを書き直すと、次のfor/inようになります。

def reverse(ary)
  result = []

  # for result[0,0] in ary
  ary.each do |item|
    result[0, 0] = item
  end

  result
end

for a in b基本的には、配列内の各項目を取得し、bそれを式に割り当てますa。したがって、単純な変数ではない場合、いくつかの魔法が起こります。

このarray[index, length] = something構文では、0 個のアイテムであっても、複数のアイテムを置換できます。したがって、ゼロのアイテムを置き換えて、インデックス 0ary[0,0] = itemに挿入するように指示します。item基本的にunshift操作です。


しかし、実際には、each代わりにブロックでメソッドを使用してください。状態を変更する本体のない for ループは、一見すると期待どおりに動作しない、最も鈍くて読みにくいものの 1 つでなければなりません。 eachはるかに少ないクレイジーな驚きを提供します。

于 2013-01-30T23:51:36.237 に答える
4

結果の最初の場所で ary に値を入れています。それでは、配列があるとしましょう: a = ["baz", "bar", "foo"]

したがってa[0,0] = 5a等しくなります[5, "baz", "bar", "foo"]

配列全体を反復処理するため、既存の要素をシフトしながら各要素を結果配列の先頭に挿入し、元の要素を逆にします。

于 2013-01-30T23:51:59.523 に答える