gpt4 book ai didi

javascript - rails 中的 "invalid slice size"错误是什么? - @categories.each_slice(column_length) 做 |column|使用此代码发生。

转载 作者:行者123 更新时间:2023-11-29 10:41:14 24 4
gpt4 key购买 nike

获取“无效切片大小”

全新的 Rails。在前端玩耍。

- column_length = @categories.length.fdiv(3).ceil
- @categories.each_slice(column_length) do |column|

此代码会产生错误。它似乎在运行站点上运行良好。到目前为止,我唯一想到的就是编辑导航和 Bootstrap 布局。

什么会导致此错误,即保持页面表单呈现?

最佳答案

好吧,我重现了错误:

[1,2,3].each_slice(0.22222222).to_a
# ArgumentError: invalid slice size
[1,2,3].each_slice(0).to_a
# ArgumentError: invalid slice size
[1,2,3].each_slice(-1).to_a
# ArgumentError: invalid slice size

#each_slice 会将其参数作为 Fixnum 实例,0 或任何负数 除外。 #each_slice 始终尝试使用 Kernel#Integer 将其参数转换为 Fixnum方法,如果执行此操作后得到 0 或任何 负数,它将向您抛出错误。如果 #each_slice 方法的 argument 不能转换为 integer ,它会给你如下所示:

[1,2,3].each_slice([1]).to_a
# TypeError: no implicit conversion of Array into Integer
[1,2,3].each_slice(Object.new).to_a
# TypeError: no implicit conversion of Object into Integer

但是你给它一个 Float 点数,如下所示,在 type casting 之后给你一个 Fixnum 实例,但不是 0,将正常工作:

[1,2,3].each_slice(2.22222222).to_a
# => [[1, 2], [3]]

现在,在你的情况下,@categories.length.fdiv(3).ceil 给你一些东西 0 或任何 负数,并且#each_slice 的那个参数值导致了错误。

好吧,我从 official documentation 中找到了它的 C 代码

static VALUE
enum_each_slice(VALUE obj, VALUE n)
{
long size = NUM2LONG(n);
VALUE ary;
NODE *memo;
int arity;

if (size <= 0) rb_raise(rb_eArgError, "invalid slice size");
RETURN_SIZED_ENUMERATOR(obj, 1, &n, enum_each_slice_size);
ary = rb_ary_new2(size);
arity = rb_block_arity();
memo = NEW_MEMO(ary, dont_recycle_block_arg(arity), size);
rb_block_call(obj, id_each, 0, 0, each_slice_i, (VALUE)memo);
ary = memo->u1.value;
if (RARRAY_LEN(ary) > 0) rb_yield(ary);

return Qnil;
}

那么,为什么 [1,2,3].each_slice(0.22222222).to_a 会导致错误 - ArgumentError: invalid slice size :

好吧,你可以从 MRI 源代码中看到 n(表示 0.22222222)已被传递给函数 NUM2LONG()。现在,如果您查看 Rubinius implementation的功能,你会发现

def self.num2long(obj)
if obj == nil
raise TypeError, "no implicit conversion from nil to integer"
else
Integer(obj)
end
end

这段代码非常清楚地说明了 NUM2LONG() 函数内部发生了什么。现在,让我们尝试 3 个示例 n 值,正如我在 IRB 中重现错误的前 3 个示例中所使用的:

Integer(0.22222) # => 0
Integer(-1) # => -1
Integer(0) # => 0

这就是 n = 0.22222 在 MRI 中 size 被函数 NUM2LONG(n) 分配为 0 的方式。该 值会触发错误。

关于javascript - rails 中的 "invalid slice size"错误是什么? - @categories.each_slice(column_length) 做 |column|使用此代码发生。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28758820/

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