gpt4 book ai didi

arrays - 数组元素赋值的奇怪行为

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:44 31 4
gpt4 key购买 nike

今天我遇到了数组元素赋值的一些奇怪行为:

arr = ["a","b"]
arr2 = [1,2]
arr.unshift(arr2) #= [[1, 2], "a", "b"]
arr.push(arr2) #=> ["a", "b", [1, 2]]

但是,这是有道理的:

arr[0,0] = arr2 #=> [1, 2, "a", "b"] 

我知道在 [0,0] 中,第一个零是 index,第二个是该数组中从 index 开始的元素数

在我看来它应该与unshift 相同,但事实并非如此。

谁能解释一下这种行为?

最佳答案

如果我们 dive into the ruby source code , 我们会找到一个名为 rb_ary_splice 的函数array assignment happens 时调用具有三个参数(即索引、长​​度和新值):

static VALUE
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
{
long offset, beg, len;

if (argc == 3) {
rb_ary_modify_check(ary);
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
rb_ary_splice(ary, beg, len, argv[2]);
return argv[2];
}
[...]

如果我们按照 rb_ary_splice 进行操作,我们就会发现奇迹发生的地方:

static void
rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
{
long rlen;
long olen;

if (len < 0) rb_raise(rb_eIndexError, "negative length (%ld)", len);
olen = RARRAY_LEN(ary);

[...]

if (len != rlen) {
RARRAY_PTR_USE(ary, ptr,
MEMMOVE(ptr + beg + rlen, ptr + beg + len,
VALUE, olen - (beg + len)));
ARY_SET_LEN(ary, alen);
}
if (rlen > 0) {
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_CONST_PTR(rpl), VALUE, rlen);
}
}
RB_GC_GUARD(rpl);
}

首先它在数组中为新元素腾出空间并更新长度:

RARRAY_PTR_USE(ary, ptr,
MEMMOVE(ptr + beg + rlen, ptr + beg + len,
VALUE, olen - (beg + len)));
ARY_SET_LEN(ary, alen);

然后通过 C 指针的魔法,它插入新元素:

MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_CONST_PTR(rpl), VALUE, rlen);

关于arrays - 数组元素赋值的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35347140/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com