2015-04-06 78 views
1

我有一個數組,看起來像這樣:[[3, 1], 4, [3, 3, 4], 4, :sync, 1, 2]用ruby寫這個.map()的更好的方法是什麼?

我想通過數組來圖,並...

  • 如果該項目是一個整數,用別的東西
  • 如果更換該項目是一個數組,只替換索引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 
+0

可能更適合代碼審查堆棧交換。 – 2015-04-06 02:35:04

回答

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

我會用Array()正常化輸入,則只有在情況下左:

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

甚至有兩張單獨的地圖:'a.map {| e | Array(e).first} .map {| e | console.button_map [e] || e}'。 – 2015-04-06 02:41:19

+0

我不關注。我明白'element = Array(work).first'(我相信你也可以寫'element = [* work] .first'),但是如果(參數)'work'是一個數組,那麼你不是映射它是它的第一個元素的一些功能,而不是保留它的其餘部分? – 2015-04-06 06:37:36

+0

@CarySwoveland:['Array(w)'](http://ruby-doc.org/core-2.2.0/Kernel.html#method-i-Array)將輸入轉換爲數組,除非它已經是一個數組array:'Array(nil)#=> []','Array(:foo)#=> [:foo]',但是'Array([:foo])#=> [:foo]' – spickermann 2015-04-06 08:29:53

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] 
相關問題