替换Ruby中的特定元素

时间:2014-06-06 07:06:07

标签: ruby-on-rails ruby

假设我在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}}

我错了什么或者我可以使用什么呢?

4 个答案:

答案 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"]

(不提倡,只是说。)