gpt4 book ai didi

arrays - Enumerable 的 group_by 是否保留 Enumerable 的顺序?

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:35 27 4
gpt4 key购买 nike

是否Enumerable#group_by保留每个值内的原始顺序?当我得到这个时:

[1, 2, 3, 4, 5].group_by{|i| i % 2}
# => {1=>[1, 3, 5], 0=>[2, 4]}

是否保证,例如,数组 [1, 3, 5] 包含此顺序的元素,而不是,例如 [3, 1, 5]?

有没有关于这一点的说明?

我没有提到键 10 之间的顺序。那是一个不同的问题。

最佳答案

是的,Enumerable#group_by 保留输入顺序。

这是该方法在 MRI 中的实现,来自 https://github.com/ruby/ruby/blob/trunk/enum.c :

static VALUE
enum_group_by(VALUE obj)
{
VALUE hash;

RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);

hash = rb_hash_new();
rb_block_call(obj, id_each, 0, 0, group_by_i, hash);
OBJ_INFECT(hash, obj);

return hash;
}

static VALUE
group_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash))
{
VALUE group;
VALUE values;

ENUM_WANT_SVALUE();

group = rb_yield(i);
values = rb_hash_aref(hash, group);
if (!RB_TYPE_P(values, T_ARRAY)) {
values = rb_ary_new3(1, i);
rb_hash_aset(hash, group, values);
}
else {
rb_ary_push(values, i);
}
return Qnil;
}

enum_group_by 按顺序在每个数组 (obj) 元素上调用 group_by_igroup_by_i 在第一次遇到一个组时创建一个单元素数组 (rb_ary_new3(1, i)),然后插入数组 (rb_ary_push(值,i))。所以输入顺序被保留。

另外,RubySpec 需要它。来自 https://github.com/rubyspec/rubyspec/blob/master/core/enumerable/group_by_spec.rb :

it "returns a hash with values grouped according to the block" do
e = EnumerableSpecs::Numerous.new("foo", "bar", "baz")
h = e.group_by { |word| word[0..0].to_sym }
h.should == { :f => ["foo"], :b => ["bar", "baz"]}
end

关于arrays - Enumerable 的 group_by 是否保留 Enumerable 的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378914/

27 4 0