Existe-t-il un moyen de refactoriser ce code? Le premier extrait est ce que j'ai actuellement et le second est la logique que j'essaie de produire.

count = 0
until count >= board.length
  if board[count] == nil
    board[count] = [nil, nil, nil, nil, nil, nil, nil, nil,]
  end
  count += 1
end
board

Sur ma 4ème ligne, je veux faire quelque chose comme

board[count] = (8.times { board[count] << nil })

Je sais que c'est à peu près aussi long. Je suis juste curieux ou je veux débusquer ma logique ... merci !!

1
Rob Matthews 26 janv. 2017 à 19:25

4 réponses

Meilleure réponse

Essayez d'utiliser le constructeur de Array

Array.new(8)
 => [nil, nil, nil, nil, nil, nil, nil, nil] 

Array.new(8, 42)
 => [42, 42, 42, 42, 42, 42, 42, 42] 

Et passez un bloc si vous avez besoin d'un objet et que vous ne voulez pas que chaque instance soit la même

Array.new(8) { Hash.new }
 => [{}, {}, {}, {}, {}, {}, {}, {}] 
8
Ursus 26 janv. 2017 à 16:37

En plus de raccourcir l'affectation à board[count] = Array.new(8), d'autres parties peuvent également être rédigées de manière plus concise:

if x == nil
  x = ...
end

C'est un modèle très courant. Il peut souvent s'écrire:

x ||= ...

Cela attribuera le côté droit à x si x est faux , c'est-à-dire nil ou false.

Dans votre exemple, cela devient:

board[count] ||= Array.new(8)

La variable de compteur explicite peut également être évitée en utilisant {{ X0}}. Cela réduit l'ensemble de votre bloc until à:

board.each_index { |i| board[i] ||= Array.new(8) }

Pour vous débarrasser de l'index, vous pouvez également utiliser map!:

board.map! { |e| e || Array.new(8) }

Cela remplacera chaque élément e par le résultat du bloc, qui est soit simplement e, soit - si e est faux - un tableau de 8 {{X3} } s.

1
Stefan 26 janv. 2017 à 17:01

Si vous cherchez à créer un tableau à deux dimensions de taille n par m rempli par la valeur x:

Array.new(n) { Array.new(m, x) }

Donc, dans votre cas, vous pouvez adapter votre code pour qu'il soit:

Array.new(count) { Array.new(8) }

La valeur par défaut dans un tableau est nil.

0
tadman 26 janv. 2017 à 17:59

Vous pouvez le faire comme

board[count] = [nil]*8
0
Seims 26 janv. 2017 à 16:43