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