更好的方式在ruby中写这个.map()?

时间:2015-04-06 00:42:08

标签: ruby arrays code-cleanup

我有一个如下所示的数组:[[3, 1], 4, [3, 3, 4], 4, :sync, 1, 2]

我想通过数组进行映射,然后......

  • 如果该项是整数,请将其替换为其他内容
  • 如果该项是数组,则仅替换索引0项,并返回数组

这是我到目前为止所做的,但它非常难看。有没有更好的方法来写这个?

也许我可以某种方式使用#tap

work.map! do |w|
  if w.is_a? Array
    w[0] = console.button_map[w[0]] || w[0]
    w
  else
    console.button_map[w] || w
  end
end

3 个答案:

答案 0 :(得分:2)

我会使用Array()来规范化输入,然后只有左边的情况:

work.map! do |w|
  element = Array(w).first
  console.button_map[element] || element
end

答案 1 :(得分:0)

我确定了这一点,不确定它是否更清洁:

work.map! do |w|                                        
  if w.is_a? Array                                      
    w.tap{|x| x[0] = console.button_map[x[0]] || x[0] } 
  else                                                  
    console.button_map[w] || w                          
  end                                                   
end

答案 2 :(得分:0)

work = [[3, 1], 4, [3, 3, 4], 4, :sync, 1, 2, [5]]

work.map! do |w|
  val = my_method [*w].first
  case w
  when Array then [val, *w[1..-1]]
  else val
  end
end

def my_method(n)
  case n
  when Fixnum then n+4
  else n.to_s
  end
end

work
  #=> [[7, 1], 8, [7, 3, 4], 8, "sync", 5, 6, [9]]

注意:

[*[1,2]] #=> [1,2]
[*3]     #=> [3]