3

配列と範囲の微妙な違いは何か疑問に思っています。x = *(1..10)xを配列として出力し*(1..10) == (1..10).to_a、エラーをスローする例に出くわしました。これは私にとって、2つの間に微妙な違いがあることを意味し、私はそれが何であるかを知りたいだけです。

4

2 に答える 2

8

まず、割り当てまたはパラメーターの受け渡しの最中でない場合*(1..10)、splat演算子はそのように解析しないため、構文エラーが発生します。これは、配列や範囲自体とは実際には関係ありませんが、それがエラーである理由を明確にしたいと思いました。

第二に、配列と範囲は実際にはリンゴとオレンジです。配列は、任意の要素のコレクションであるオブジェクトです。範囲は、「開始」と「終了」を持つオブジェクトであり、間にあるすべての要素を列挙することなく、開始から終了に移動する方法を知っています。

最後に、範囲をで配列に変換する場合to_a、「この範囲の最初から始めて、最後に到達するまで要素を与え続けてください」と言っているほど、実際には「変換」していません。「(1..10)」の場合、範囲は1、2、3のように、10になるまで続きます。

于 2012-05-07T23:15:22.300 に答える
1

1つの違いは、配列とは異なり、範囲がすべての要素を個別に格納するわけではないことです。

r = (1..1000000) # very fast
r.to_a # sloooooow

ただし、任意のポイントにインデックスを付ける機能は失われます。

于 2012-05-07T23:14:30.090 に答える