【发布时间】:2013-05-07 15:26:37
【问题描述】:
我正在为一家红宝石店的实习面试做准备。我期待的工作问题之一是重新实现可枚举的方法。
我现在正在尝试实现 map,但我无法弄清楚如何实现没有给出块的情况。
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]
但是,我不确定如何获取未传入块的情况:
[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;
}
【问题讨论】:
-
那是 C 源代码。这对您在 Ruby 中重新实现该方法没有多大帮助。另外,为什么
.mapp("cat")会返回["cat", "cat", "cat"]?那没有意义。内置的.map方法抛出异常。 -
此外,这是 flat_map 的代码,而不是 map。老实说,我认为现在使用 Ruby 做工作还为时过早。
-
也许你可以看看 Rubinius 的来源,例如github.com/rubinius/rubinius/blob/master/kernel/bootstrap/…
-
忽略 C 代码。除非您申请了非常高级的职位,否则雇主可能只是希望您了解
yield。不过,无阻塞实现可能会给你加分!
标签: ruby-on-rails ruby map