只是想知道数组和范围之间的细微差别是什么。我遇到了一个示例,我将x = *(1..10)
输出x作为数组,*(1..10) == (1..10).to_a
引发错误。这对我来说意味着两者之间存在细微差别,我只是好奇它是什么。
答案 0 :(得分:7)
首先,当您不在赋值或参数传递的中间时,*(1..10)
是语法错误,因为splat运算符不会解析这种方式。这与数组或范围本身并没有关系,但我想我会清楚为什么这是一个错误。
其次,数组和范围实际上是苹果和橙子。数组是一个对象,它是任意元素的集合。范围是具有“开始”和“结束”的对象,并且知道如何从开始移动到结束而不必枚举其间的所有元素。
最后,当你将一个范围转换为一个to_a
的数组时,你并没有真正“转换”它,就像你说的那样,“从这个范围的开头开始并继续给我元素直到你到达终点“。在“(1..10)”的情况下,范围为1,然后是2,然后是3,依此类推,直到达到10。
答案 1 :(得分:1)
一个区别是,与数组不同,范围本身不会单独存储每个元素。
r = (1..1000000) # very fast
r.to_a # sloooooow
然而,你失去了索引到任意点的能力。