假设我在ruby中有一个数组:
arr = ['M','X','C','Y','C']
如何使用'M'
'Y'
和'1'
的元素
并将'X'
替换为'2'
以及'C'
与'5'
['1','2','5','1','5']
所以最后我的数组转换为:
arr.map { |i| case i
when ['X'].include? i then '2'
when ['M','Y'].include? i then '1'
when ['C'].include? i then '5'
end }
我知道我尝试了几种方法,例如案例循环:
syntax error, unexpected keyword_end, expecting '}'
... end }
但那不知何故给了我这个错误:
{{1}}
我错了什么或者我可以使用什么呢?
答案 0 :(得分:8)
使用哈希和Array#map!
:
mapping = {'M' => '1', 'Y' => '1', 'X' => '2', 'C' => '5'}
arr = ['M','X','C','Y','C']
arr.map! { |c| mapping[c] }
# => ["1", "2", "5", "1", "5"]
<强>更新强>
正如Stefan建议的那样,您也可以使用Hash#values_at
:
arr = ['M','X','C','Y','C']
mapping = {'M' => '1', 'Y' => '1', 'X' => '2', 'C' => '5'}
mapping.values_at(*arr)
# => ["1", "2", "5", "1", "5"]
答案 1 :(得分:2)
关于您的错误,您可以使用case
语句,如下所示:
arr = ['M','X','C','Y','C']
arr.map { |i|
case i
when 'X' then '2'
when 'M', 'Y' then '1'
when 'C' then '5'
end
}
#=> ["1", "2", "5", "1", "5"]
为每个元素调用块,元素作为i
传递到块中。
答案 2 :(得分:1)
如果数组始终是字符串,则可以执行以下操作:
arr = %W(M X C Y C)
arr.join.tr("MYXC", "1125").split("")
答案 3 :(得分:0)
您可以使用Module#const_get,如下所示:
M,X,C,Y = '1','2','5','1'
arr = ['M','X','C','Y','C']
arr.map { |e| Object.const_get(e) }
#=> ["1", "2", "5", "1", "5"]
(不提倡,只是说。)