Ruby中数组和范围有什么区别?

4

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

2个回答

9
首先,在没有任务或参数传递中,*(1..10)是一个语法错误,因为展开运算符不会以这种方式解析。这与数组或范围本身并不相关,但我想澄清一下为什么会出现这个错误。
其次,数组和范围是完全不同的两个概念。数组是一个包含任意元素的集合对象,而范围是一个具有“开始”和“结束”的对象,并且知道如何在不枚举所有中间元素的情况下从开始移动到结束。
最后,当您使用to_a将范围转换为数组时,您并不是真正地“转换”,而是在说:“从此范围的开头开始,直到达到末尾为止,请继续给我元素。”在“(1..10)”的情况下,范围会给您1,然后是2,然后是3,以此类推,直到达到10。

抢我的台词了。+1指出错误与范围无关。 - Andrew Marshall
“从起始点到结束点移动”的部分是可选的,仅适用于范围的起始点响应succ(http://ruby-doc.org/core-1.9.3/Range.html#method-i-each)。 - mu is too short

2

一个不同之处在于range不像数组那样单独存储每个元素。

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

不过,你失去了到任意点的索引能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接