gpt4 book ai didi

ruby-on-rails - 在 Ruby 中重新实现 Enumerable Map 方法

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

我正在为一家 ruby 店的实习面试做准备。我期望的工作问题之一是重新实现一个可枚举的方法。

我现在正在尝试实现 map ,但我无法弄清楚如何实现未给出 block 的情况。

class Array
def mapp()
out = []
if block_given?
self.each { |e| out << yield(e) }
else
<-- what goes here? -->
end
out
end
end

使用我当前的实现。如果我运行:

[1,2,3,4,5,6].mapp{|each| each+1} #returns => [2,3,4,5,6,7]

但是,我不确定如何获取未传入 block 的情况:

[1,2,3,4].mapp("cat") # should return => ["cat", "cat", "cat", "cat"]

如果有人能指出我正确的方向。我真的很感激。我尝试查看源代码,但它做的事情似乎与我习惯的非常不同。

static VALUE
enum_flat_map(VALUE obj)
{
VALUE ary;

RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);

ary = rb_ary_new();
rb_block_call(obj, id_each, 0, 0, flat_map_i, ary);

return ary;
}

最佳答案

我想 [1,2,3,4].mapp("cat") 你的意思是 [1,2,3,4].mapp{"cat"

也就是说,没有 block 的映射返回一个枚举器:

 [1,2,3,4].map
=> #<Enumerator: [1, 2, 3, 4]:map>

这与 to_enum 的输出相同

[1,2,3,4].to_enum
=> #<Enumerator: [1, 2, 3, 4]:each>

所以在你的代码中,你只想调用 to_enum:

class Array
def mapp()
out = []
if block_given?
self.each { |e| out << yield(e) }
else
out = to_enum :mapp
end
out
end
end

关于ruby-on-rails - 在 Ruby 中重新实现 Enumerable Map 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16422872/

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