我有一个像这样的数组:
[1,2,3,2,4,5,3,7,8]
我希望将它们映射到其他元素2 => 'b',3 => 'a'
[1,'b','a','b',4,5,'a',7,8]
有哪些策略可以做到这一点?
arr = [1,2,3,2,4,5,3,7,8]
h = { 2=>'b', 3=>'a' }
h.default_proc = ->(_,k) { k }
h.values_at(*arr)
#=> [1, "b", "a", "b", 4, 5, "a", 7, 8]
这里有另一种可能的解决方案,类似于@falsetru的答案:
mapping = Hash.new {|_, v| v }.merge(2 => 'b', 3 => 'a')
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping.method(:[]))
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8]
在 Ruby 问题跟踪器上的 Feature #11262 – 让更多对象像 "Functions" 一样行为 中,我建议 Hash
应该像从键到值的函数一样运作,即它们应该实现 call
和 to_proc
,这将允许您直接将 mapping
作为转换函数传递给 map
:
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping)
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8]
在我的建议得到实现之前(考虑到两个月内没有人看过它,这可能永远不会发生),您需要使用此猴子补丁才能使其正常工作:
module HashAsFunction
refine Hash do
alias_method :call, :[]
def to_proc
method(:call).to_proc
end
end
end
using HashAsFunction