Ruby数组切片中无左边界Range的原理及报错疑问解析
Ruby数组切片
...语法的实现原理及相关问题解析 一、a[...4]的实现逻辑
Ruby 2.6版本开始支持省略左边界的范围写法,...4本质是左边界为nil的范围,和nil...4完全等价。
但数组的[](切片)方法对这种左边界为nil的范围做了特殊适配:当传入的范围起始值是nil时,会自动把起始位置替换成数组的第一个索引(也就是0),同时保留...的“右边界不包含”特性——所以a[...4]就等同于a[0...4],最终取出数组中索引0到3的元素。
你可以用这段代码验证这个逻辑:
a = [0,1,2,3,4] p a[nil...4] == a[0...4] # 输出 true
二、(...4).to_a报错的原因
(...4)是一个起始未定义的无限范围,Range#to_a方法的作用是把范围转换成数组,这需要从起始值开始逐个生成元素直到右边界。但nil不是一个可迭代的起始点——它没有对应的数值,也没法进行递增运算,Ruby根本不知道该从哪个值开始生成序列,所以会直接抛出Cannot Iterate from NilClass的错误。
而数组切片能处理这种范围,是因为数组本身有明确的索引边界,它不会去遍历这个无限范围,而是直接把nil起始的范围适配成数组的合法起始索引。
内容的提问来源于stack exchange,提问作者Dmitry Dmitriev
相关产品推荐
相关产品推荐

