3

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

4

2 回答 2

8

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

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

最后,当您使用 将范围转换为数组时to_a,您并没有真正“转换”它,就像您所说的“从该范围的开头开始并不断给我元素直到到达结尾”。在“(1..10)”的情况下,范围是给你 1,然后是 2,然后是 3,依此类推,直到你达到 10。

于 2012-05-07T23:15:22.300 回答
1

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

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

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

于 2012-05-07T23:14:30.090 回答