2016-09-21 60 views
-2

我想創建一個像Array#my_map這樣的實例方法,並且該方法應該是原始的Array#map方法的行爲。 我想從下面的新方法相同的輸出:創建自己的Array#地圖方法

arr = [1, 2, 3, 4] 
arr.new_map_method do |x| 
x + 1 
end # => [2, 3, 4, 5] 

arr.new_map_method(&:to_s) # => ["1", "2", "3", "4"] 
+0

嘗試使用'each'和'push'。 –

+0

啊@ sagarpandya82我想自己的方法與數組映射相同輸出 – umishra

+2

這裏有個問題嗎? –

回答

1

用不同的方法相同的行爲創建方法的最簡單的方法是一個簡單的alias

class Array 
    alias_method :new_map_method, :map 
end 

不管出於何種奇怪的原因,你不希望使用map,您可以使用inject代替:

class Array 
    def new_map_method 
    return enum_for(__callee__) unless block_given? 
    inject([]) {|acc, el| acc << yield(el) } 
    end 
end 
+0

也許'each_with_object'會稍微適合一些。 – Stefan

+0

你能解釋一下「return enum_for(__ callee__)」這裏爲什麼你拿了__callee__這是什麼意思? – umishra

+0

@uishr​​a:關於文檔有什麼不清楚的地方嗎?什麼*確切*不清楚文件? –

1

謝謝你們!我還做了一個解決方案爲我qeestion

class Array 
def my_map(&block) 
    result = [] 
    each do |element| 
    result << block.call(element) 
    end 
    result 
end 
end 

函數調用

[1,2,3].my_map(&:to_s) 

輸出=> [ 「1」, 「2」, 「3」]

[1, 2, 3, 4, 5].my_map do |x| 
    x 
end 

output => [1,2,3,4,5]

+0

'[1,2,3] .my_map'呢?參見[Array#map](http://ruby-doc.org/core-2.3.0/Array.html#method-i-map)。 –

+0

@CarySwoveland感謝您指點,我正在重構我的代碼。 – umishra