`

ruby array - unexpected return

    博客分类:
  • Ruby
阅读更多
【基本介绍】
这里mark下ruby array遇到的一个问题

【简单例子】
irb(main):040:0> arr
=> [1, 2, 3, 4, 5]
irb(main):041:0> arr[5]
=> nil
irb(main):042:0> arr[5,0]    #为什么不是nil?
=> []
irb(main):043:0> arr[6]  
=> nil
irb(main):044:0> arr[6,0]    #正常理解返回nil
=> nil
irb(main):045:0> arr.length
=> 5


问题:数组的index是从0-N,例子里面的最大下表应该是4,那问题为什么arr[5,0]返回不是nil而是[]


源码:
VALUE
rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{
VALUE arg;
long beg, len;
if (argc == 2) {
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
if (beg < 0) {
beg += RARRAY_LEN(ary);
}
return rb_ary_subseq(ary, beg, len);
}


VALUE
rb_ary_subseq(VALUE ary, long beg, long len)
{
VALUE klass;
long alen = RARRAY_LEN(ary);
if (beg > alen) return Qnil;
if (beg < 0 || len < 0) return Qnil;
if (alen < len || alen < beg + len) {
len = alen - beg;
}
klass = rb_obj_class(ary);
if (len == 0) return ary_new(klass, 0);
return ary_make_partial(ary, klass, beg, len);
}

源码里面比较的begin与数组长度,比数组长的还回nil,否则还回数组片段。(因为数组的长度其实比下标要大1)


【参考】
https://github.com/ruby/ruby/blob/trunk/array.c
http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking-for-explanation-for-illogical-behaviour-taken-fr
分享到:
评论

相关推荐

    Could not perform operation -- unexpected exception. Unexpected failure (8000ff

    在尝试使用INTouch 2014 R2 SP1版本软件在Windows 10操作系统上创建新型应用程序时,用户遇到了“Could not perform operation -- unexpected exception. Unexpected failure (8000ffff)”这一错误提示。该问题出现...

    前端开源库-unexpected-function-equality

    "unexpected-function-equality" 是一个专注于函数等价性比较的开源库,它旨在帮助开发者们更直观、准确地判断两个函数是否具有相同的行为,即使它们的实现可能有所不同。在JavaScript这种动态类型的编程语言中,...

    JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar

    - Unexpected error: null java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953) java.util.LinkedList$ListItr.next(LinkedList.java:886) JMeter.plugins.functional.samplers....

    detecting-the-unexpected:通过图像再合成检测意外

    python-headless matplotlib h5py natsort imageio torch torchvision scipy tqdm tensorboard future ipython 要运行笔记本文件: pip install jupyterlab训练有素的体重下载并将其放置在detecting-the-unexpected/...

    初三Unit-12Life-is-full-of-the-unexpected讲解及练习.doc

    过去完成时是英语语法中的一个重要时态,它用来表达在过去某一特定时间或动作之前已经完成的动作或存在的状态。这个时态通常强调的是"过去的过去",即动作的先后顺序,其中一个动作发生在另一个动作之前。...

    karma-unexpected:出乎意料的业力

    $ npm install karma-unexpected --save-dev 或者来自 Github: $ npm install 'git+https://github.com/marcopeg/karma-unexpected.git' --save-dev 在 Karma 配置中向frameworks键添加unexpected : module....

    karma-unexpected:用于意外测试库的 Karma 适配器

    在压缩包`karma-unexpected-master`中,可能包含了源码、示例、文档和其他资源,供开发者学习和参考。通过阅读这些文件,可以更深入地了解如何有效地使用karma-unexpected适配器来提升JavaScript项目的测试效率和...

    browserify-unexpected-end-of-input

    "browserify-unexpected-end-of-input" 是一个在使用 Browserify 工具时可能出现的错误,主要涉及 JavaScript 的打包过程。Browserify 是一个流行的工具,它允许开发者将 Node.js 模块系统引入到浏览器环境中,使得...

    orabbix解决兼容问题的orabbix-1.2.3.jar

    解决 Orabbix报错“received unexpected response ' ' for key 'archive' ” 该问题是因为 zabbix4.0及以上版本和 orabbix-1.2.3不兼容导致的。 需要重新编译Sender.java进去。 我这里已经准备好了编译过的jar包。...

    C++出错提示英汉对照表

    Fuction should return a value ------------------函数必需返回一个值 Goto statement missing label ------------------ Goto语句没有标号 Hexadecimal or octal constant too large ------------------16进制或...

    jmeter测试websocket所需jar包(完整版)

    etty-http-9.1.2.v20140210.jar,jetty-util-9.1.2.v20140210.jar,jetty-io-9.1.2.v20140210.jar,websocket-common-9.1.1.v20140108.jar,websocket-client-9.1.1.v20140108.jar,websocket-api-9.1.1.v20140108.jar ...

    string-replace-unexpected-behavior:这是一个错误吗?

    string#replace()意外行为 描述 // Prepare. const assert = require ( "assert" ) const fs = require ( "fs" ) const S = fs . readFileSync ( "S.txt" , "utf8" ) const A = fs ....const B = fs .... A .... B ....con

    我的世界启动器源码java-Minecraft-Technic-Launcher-Unexpected-Eror:堆栈跟踪IndexOutOf

    我的世界启动器源码java 我的世界技术发射器意外的错误 堆栈跟踪:异常:IndexOutOfBoundsException消息:索引:0,大小:0跟踪:java.util.ArrayList.rangeCheck(未知源)java.util.ArrayList.get(未知源)org....

    UiautomatorViewer最新源码

    **UiautomatorViewer**是Android自动化测试中的一个重要工具,主要用于可视化地检查和分析应用程序的用户界面元素。这个工具基于`uiautomator`框架,允许开发者获取UI组件的详细信息,如它们的属性、坐标以及层级...

    解决了3.10.0,Unexpected char xxx at xx in header name异常的jar包

    解决了3.10.0Unexpected char 0x20 at 19 in header name: x-upyun-api-version

    websocket开发及测试所需的jar 全套 如:JMeterWebSocketSampler

    JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar websocket-api-9.1.1.v20140108.jar websocket-client-9.1.1.v20140108.jar websocket-common-9.1.1.v20140108.jar jetty-util-9.1.2.v20140210.jar

    linkedlist problems

    ### 链表问题概述与知识点解析 #### 标题:链表问题 斯坦福大学提供的这份文档聚焦于链表编程技巧与问题解决方法。链表作为一种基础的数据结构,在计算机科学领域占据着重要的地位,尤其是在数据管理和算法设计...

    解决error: Unexpected console statement (no-console) at src\... 的js文件

    Vuejs报错error: Unexpected console statement (no-console) at src\... 解决办法

    eslint-plugin-lwc:LWC的官方ESLint规则

    @ lwc / eslint-plugin-lwc 闪电Web组件(LWC)的官方ESLint规则。安装$ npm install eslint babel-eslint @lwc/eslint-plugin-lwc --save-dev用法将lwc添加到配置的plugins部分。 然后在“ rules部分中配置所需的...

    pxe-boot:pxe引导设置命令

    【pxe-boot:pxe引导设置命令】 在IT领域,特别是服务器管理与自动化部署中,网络启动(Network Boot)是一种高效的技术,它允许计算机通过网络加载操作系统映像,而不是从本地硬盘启动。PXE(Preboot Execution ...

Global site tag (gtag.js) - Google Analytics