7

ルビーショップでインターンシップ面接の練習中です。私が期待している仕事の質問の 1 つは、列挙可能なメソッドを再実装することです。

現在マップを実装しようとしていますが、ブロックが指定されていない場合の実装方法がわかりません。

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;
}
4

5 に答える 5

1

rubiniusには、可能な限りRubyで記述された Ruby 実装があります。enumerable.#collectのコードを見ることができます。

興味深いのは、

于 2013-05-07T16:41:43.337 に答える
-1

のドキュメントを確認してくださいObject#to_enum

于 2013-05-07T15:35:18.810 に答える