我想创建一个像Array#my_map
这样的实例方法,该方法应该具有原始Array#map
方法的行为。我想从new方法得到如下相同的输出:
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"]
创建具有不同方法相同行为的方法的最简单方法是一个简单的别名:
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
谢谢你们了!我也为我的问题做了一个解决方案
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)
output => ["1", "2", "3"]
[1, 2, 3, 4, 5].my_map do |x|
x
end
output => [1,2,3,4,5]