用ruby编写这个.map()的更好方法?

用ruby编写这个.map()的更好方法?,ruby,arrays,code-cleanup,Ruby,Arrays,Code Cleanup,我有这样一个数组:[[3,1],4[3,3,4],4,:sync,1,2] 我想通过数组映射,然后 如果该项是整数,请将其替换为其他项 如果项是数组,则仅替换索引0项,然后返回数组 这是我目前所拥有的,但它非常丑陋。有没有更好的方法写这个 也许我可以使用#点击 work.map! do |w| if w.is_a? Array w[0] = console.button_map[w[0]] || w[0] w else console.button_map[w

我有这样一个数组:
[[3,1],4[3,3,4],4,:sync,1,2]

我想通过数组映射,然后

  • 如果该项是整数,请将其替换为其他项
  • 如果项是数组,则仅替换索引0项,然后返回数组
这是我目前所拥有的,但它非常丑陋。有没有更好的方法写这个

也许我可以使用
#点击

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

我决定了,不确定它是否能更干净:

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
我将使用
Array()
规范化输入,然后只剩下大小写:

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


可能更适合代码复查堆栈交换。甚至两个单独的映射:
a.map{e}数组(e).first}.map{e}控制台.button_map[e]|e}
。我不懂。我理解
element=Array(work)。首先
(我相信你也可以写
element=[*work]。首先
),但是如果(参数)
work
是一个数组,你不是把它映射到它的第一个元素的某个函数上了吗,而不是保留它的其余部分?@CarySwoveland:将输入转换为数组,除非它已经是数组:
array(nil)#=>[]
array(:foo)#=>[:foo]
,但是
array([:foo])却=>[:foo]
不错!这是个了不起的主意。
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]