2012-05-07 51 views
1

只是想知道数组和范围之间的细微差别是什么。我碰到一个例子,我有x = *(1..10)作为一个数组输出x和*(1..10) == (1..10).to_a引发错误。这对我来说意味着两者之间存在细微的差异,我只是好奇它是什么。ruby​​中的数组和范围有什么区别?

回答

6

首先,当您不处于任务或参数传递的中间时,*(1..10)是语法错误,因为splat操作符不会以这种方式解析。这本质上并不涉及数组或范围,但我想我会清楚为什么这是一个错误。

其次,阵列和范围真的是苹果和橘子。数组是一个对象,它是任意元素的集合。范围是具有“开始”和“结束”的对象,并且知道如何从开始移动到结束而不必枚举其间的所有元素。

最后,当你将一个范围转换为一个带有to_a的数组时,你并不是真的“转换”它,就像你说的那样,“从这个范围的开始开始,并且继续给出元素直到你到达结束”。在“(1..10)”的情况下,范围是给你1,然后2,然后3,依此类推,直到你达到10为止。

+0

击败我吧。 +1指出该错误与Range无关。 –

+0

“从开始移动到结束”部分是可选的,只有当范围的起始位置响应'succ'时才适用(http://ruby-doc.org/core-1.9.3/Range.html#method- I-每个)。 –

1

一个区别是,范围不单独存储每个元素本身,不像数组。

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

但是,您失去了索引到任意点的能力。

相关问题