def reverse(ary)
result = []
for result[0,0] in ary
end
result
end
assert_equal ["baz", "bar", "foo"], reverse(["foo", "bar", "baz"])
これは機能し、その理由を理解したいと思います。説明はありますか?
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
はるかに少ないクレイジーな驚きを提供します。
結果の最初の場所で ary に値を入れています。それでは、配列があるとしましょう:
a = ["baz", "bar", "foo"]
したがってa[0,0] = 5
、a
等しくなります[5, "baz", "bar", "foo"]
配列全体を反復処理するため、既存の要素をシフトしながら各要素を結果配列の先頭に挿入し、元の要素を逆にします。