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