2015-04-06 5 views
1

J'ai un tableau qui ressemble à ceci: [[3, 1], 4, [3, 3, 4], 4, :sync, 1, 2]Une façon plus simple d'écrire ce fichier .map() dans ruby?

Je veux la carte à travers le réseau, et ...

  • Si l'élément est un entier, le remplacer par quelque chose d'autre
  • Si l'élément est un tableau, remplacez seulement l'élément 0 d'index, et renvoyez le tableau

C'est ce que j'ai jusqu'ici mais c'est très moche. Y a-t-il une meilleure façon d'écrire cela?

Peut-être que je peux en quelque sorte utiliser #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

Probablement plus approprié pour l'échange de pile de révision de code. –

Répondre

0

je me suis installé sur ce point, pas sûr si elle peut être plus propre:

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

J'utiliser Array() pour normaliser l'entrée et il n'y a que le cas à gauche:

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

Ou même deux cartes distinctes: 'a.map {| e | Tableau (e). Premier} .map {| e | console.button_map [e] || e} '. –

+0

Je ne suis pas. Je comprends 'element = Array (work) .first' (que je crois que vous pourriez aussi écrire' element = [* work] .first'), mais si (l'argument) 'work' est un tableau, ne faites-vous pas de mapping? à une certaine fonction de son premier élément, plutôt que de garder le reste de celui-ci? –

+0

@CarySwoveland: ['Array (w)'] (http://ruby-doc.org/core-2.2.0/Kernel.html#method-i-Array) transforme l'entrée en un tableau à moins qu'il ne soit déjà un array: 'Array (nil) # => []', 'Array (: foo) # => [: foo]', mais 'Array ([: foo]) # => [: foo]' – spickermann

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]] 

Note:

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