我想知道数组和范围之间的微妙差别。我遇到了一个例子,x = *(1..10)
将x输出为数组,而 *(1..10) == (1..10).to_a
报错了。这意味着对我来说这两者之间存在微妙的区别,我只是好奇它是什么。
*(1..10)
是一个语法错误,因为展开运算符不会以这种方式解析。这与数组或范围本身并不相关,但我想澄清一下为什么会出现这个错误。to_a
将范围转换为数组时,您并不是真正地“转换”,而是在说:“从此范围的开头开始,直到达到末尾为止,请继续给我元素。”在“(1..10)”的情况下,范围会给您1,然后是2,然后是3,以此类推,直到达到10。一个不同之处在于range不像数组那样单独存储每个元素。
r = (1..1000000) # very fast
r.to_a # sloooooow
不过,你失去了到任意点的索引能力。
succ
(http://ruby-doc.org/core-1.9.3/Range.html#method-i-each)。 - mu is too short