Ruby:Range是空的,但用它切片会产生元素

cHa*_*Hao 7 ruby arrays range slice

我正在学习Ruby,并且刚刚学习了一些关于数组和范围的东西.我碰到了一些关于切片的东西,虽然乍看起来很有意义但是当我深入研究它时会让我感到困惑.

IRB说这(2..-1).to_a是一个空数组,意味着范围内没有值,对吧?
但如果我使用相同的范围[:a, :b, :c, :d, :e][2..-1],我会回来[:c, :d, :e]而不是一个空数组.

现在,我知道-1表示数组的最后一个元素,所以选择的内容是有道理的.但是,如果范围本身是空的,它如何选择任何东西?

Pet*_*ter 11

这是一个引人入胜的问题.答案是切割数组时不是检查范围的各个元素,而是first和last元素.特别:

>> (2..-1).to_a
=> []
>> (2..-1).first
=> 2
>> (2..-1).last
=> -1
Run Code Online (Sandbox Code Playgroud)

因此该示例有效,因为它将数组从[2]元素切片到[-1]元素.

如果你想要一致的思考方式,可以考虑(2..-1).to_a输出在2和之间找到的整数-1(其中没有),但这[2..-1]意味着从2 索引到-1 索引.

(来源:array.c并range.c在Ruby源代码中.)

而且,复杂的奖励部分:为了获得你正在考虑的意义,你可以使用

>> [:a, :b, :c, :d, :e].values_at *(2..-1).to_a
=> []
Run Code Online (Sandbox Code Playgroud)

  • 更确切地说:`foo([1,2,3])`用一个(列表)参数调用`foo`.`foo(*[1,2,3])`用三个调用它:它相当于`foo(1,2,3)`; 列表被解构,其元素在函数调用上散布. (2认同)