为什么 RARRAY_LEN 没有被分配?

发布于 2024-11-17 17:10:57 字数 240 浏览 3 评论 0原文

我正在使用 C 扩展方法创建一个新的 ruby​​ 数组,但 RARRAY_LEN 未设置。我做错了什么吗?

long int max = 4;
VALUE rAry;

rAry = rb_ary_new2(max);
printf("allocated: %lu\n", RARRAY_LEN(rAry));

输出:

allocated: 0

I'm using the C extension methods to create a new ruby array, but RARRAY_LEN is not getting set. Am I doing something wrong?

long int max = 4;
VALUE rAry;

rAry = rb_ary_new2(max);
printf("allocated: %lu\n", RARRAY_LEN(rAry));

output:

allocated: 0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仅冇旳回忆 2024-11-24 17:10:57

来自 array.c (Ruby 1.8.6):
#define RARRAY_LEN(s) (RARRAY(s)->len)

RARRAY(s)->lenArray#length 相同代码>.

rb_ary_new2(4)Array.new(4) 不同。

VALUE
rb_ary_new2(len)
    long len;
{
    return ary_new(rb_cArray, len);
}

VALUE
rb_ary_new()
{
    return rb_ary_new2(ARY_DEFAULT_SIZE);
}

ARY_DEFAULT_SIZE 定义为 16

它所做的只是为数组分配内存 - 但不填充它。当您知道数组的最终大小时使用它,这样就不必动态调整其大小。

您想要用于实现目的的是 rb_ary_new3rb_ary_new4

来自Ruby 编程:实用程序员指南

VALUE rb_ary_new3(长长度,...")

返回给定长度的新Array,并用其余参数填充。

VALUE rb_ary_new4(长长度,VALUE *值“)

返回给定长度的新Array,并用 C 数组值填充。

请注意,这些函数要求您为每个元素提供一个值。因此,您需要执行类似以下操作:rAry = rb_ary_new3(4, Qnil, Qnil, Qnil, Qnil)来复制Array.new(4)。如果您提供的参数较少,您会在 Ruby 中得到奇怪的行为。 (没有例外 - 尽管你得到了一个无效的对象。)

From array.c (Ruby 1.8.6):
#define RARRAY_LEN(s) (RARRAY(s)->len)

RARRAY(s)->len is the same as Array#length.

rb_ary_new2(4) is not the same as Array.new(4).

VALUE
rb_ary_new2(len)
    long len;
{
    return ary_new(rb_cArray, len);
}

VALUE
rb_ary_new()
{
    return rb_ary_new2(ARY_DEFAULT_SIZE);
}

ARY_DEFAULT_SIZE is defined as 16.

What is does is just allocate memory for an array - but doesn't populate it. Use it when you know the final size of your array so it doesn't have to be dynamically re-sized.

What you want to use for your intentions are rb_ary_new3 or rb_ary_new4.

From Programming Ruby: The Pragmatic Programmer's Guide:

VALUE rb_ary_new3(long length, ...")

Returns a new Array of the given length and populated with the remaining arguments.

VALUE rb_ary_new4(long length, VALUE *values")

Returns a new Array of the given length and populated with the C array values.

Note that these functions require you to provide a value for each element. So you'd need to do something like: rAry = rb_ary_new3(4, Qnil, Qnil, Qnil, Qnil) to replicate Array.new(4). If you provided less arguments you'd get strange behavior in Ruby. (No exceptions - despite the fact you get an invalid object.)

野侃 2024-11-24 17:10:57

显然需要使用 rb_ary_store(obj, index, val) 来增加 RARRAY_LEN。奇怪的是,如此重要的方法基本上没有记录。

Apparently rb_ary_store(obj, index, val) needs to be used to increment RARRAY_LEN. It's strange that a method so crucial is basically undocumented.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文