红宝石中数组和范围之间有什么区别?

时间:2012-05-07 23:07:41

标签: ruby arrays range

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

2 个答案:

答案 0 :(得分:7)

首先,当您不在赋值或参数传递的中间时,*(1..10)是语法错误,因为splat运算符不会解析这种方式。这与数组或范围本身并没有关系,但我想我会清楚为什么这是一个错误。

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

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

答案 1 :(得分:1)

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

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

然而,你失去了索引到任意点的能力。