加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:34:36 所属栏目:百科 来源:网络整理
导读:我正在学习 Ruby,并且刚刚学习了一些关于数组和范围的东西.我碰到了关于切片的东西,虽然乍看起来很有意义但是当我深入研究它时会让我感到困惑. IRB说(2 ..- 1).to_a是一个空数组,意味着该范围内没有值,对吗? 但如果我在[:a,:b,:c,:d,:e] [2 ..- 1]中使
我正在学习 Ruby,并且刚刚学习了一些关于数组和范围的东西.我碰到了关于切片的东西,虽然乍看起来很有意义但是当我深入研究它时会让我感到困惑.

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

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

解决方法

这是一个引人入胜的问题.答案是,在切割数组时,不是要检查的范围的各个元素,而是第一个和最后一个元素.特别:
>> (2..-1).to_a
=> []
>> (2..-1).first
=> 2
>> (2..-1).last
=> -1

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

如果你想要一致的思考方法,可以考虑(2 ..- 1).to_a输出在2和-1之间找到的整数(其中没有),但[2 ..- 1]表示-1指数指向-1指数.

(来源:Ruby源代码中的array.c和range.c.)

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读