Cela peut-il être refactorisé en booléen? board
est un tableau et move
est un index. position_taken? (board, move)
doit renvoyer false
si board [move]
vaut ""
, ""
ou nil
mais renvoie true
si board [move]
est "X"
ou "O" .
def position_taken?(board, move) if board[move] == " " false elsif board[move] == "" false elsif board[move] == nil false else true end end
8 Réponses :
Il est difficile de savoir ce que fait votre méthode sans savoir ce que vous passerez comme argument du tableau donc le mieux que je puisse démo est juste une chaîne:
str='' !!(str && !str.strip.empty?) #=> false str='a' !!(str && !str.strip.empty?) #=> true str=' ' !!(str && !str.strip.empty?) #=> false str=' ' !!(str && !str.strip.empty?) #=> false str=nil !!(str && !str.strip.empty?) #=> false
Je pense que c'est logiquement équivalent:
def position_taken?(board, move) ["", " ", nil].exclude?(board[move]) end
Si l'une des conditions est vraie, elle sera inversée et retournera false. Si toutes les conditions sont fausses, elles seront inversées en vrai.
Vous pouvez également mettre les chaînes que vous souhaitez comparer dans un tableau et utiliser quelque chose comme ! Include? ou, si vous utilisez
ActiveSupport
, vous pouvez utiliser exclude?
.
def position_taken?(board, move) !(board[move] == " " || board[move] == "" || board[move] == nil) end
les internes ont un sens pour la correspondance de chaînes, mais savons-nous quel type de données est passé pour la carte?
avez-vous besoin d'une comparaison pour zéro? pourquoi pas ! board [move]
@lacostenycoder ! board [move]
fonctionnerait mais la double inversion pourrait être difficile à suivre. Vous pouvez également utiliser board [move] .nil?
.
exclude?
est une méthode active_support. ! include?
peut fonctionner sans utiliser Rails.
Vous pouvez utiliser none?
et passer board [move]
pour être comparé:
[' ', '', nil].none?(nil) # false [' ', '', nil].none?('') # false [' ', '', nil].none?(' ') # false [' ', '', nil].none?('t') # true
agréable. mais cette syntaxe, je pense, est pour ruby> = v2.5 .x?
Ya !, vous avez raison, est de 2.5+. Sinon, il devrait être utilisé avec un bloc.
FWIW, ce code doit être remanié en:
def position_taken?(board, move) not board[move].to_s.strip.empty? end
Cela n'a probablement pas d'importance, mais cela a un comportement légèrement différent de celui du code d'origine à cause de strip
. Par exemple, ""
(deux espaces) renverrait true
dans le code d'origine mais false
dans cette implémentation.
@ScottBartell c'est tic-tac-toe; board [move] .length == 1
est toujours vrai.
Haaa, eh bien cela a beaucoup de sens ... Je n'avais pas réalisé que c'était du tic-tac-toe.
Puisque vous avez des cas positifs moins nombreux et plus simples, je testerais le contraire:
def position_taken?(board, move) %w[X O].include?(board[move]) end
Il traitera les valeurs invalides différemment de votre approche d'origine, mais il fait directement ce que le nom de la méthode suggère: check si la position est prise (au lieu de vérifier si la position n'est pas prise).
def position_taken?(board, move) !case board[move]; when " ", "", nil; true end end
Pouvez-vous ajouter quelques explications à cette réponse? D'après l'examen .
C'est juste une construction case
annulée. Rien de particulier à expliquer.
J'ai trouvé la solution. Il peut être remanié comme suit:
def position_taken?(board, move) board[move] != " " && board[move] != "" end
qui renvoie vrai si board [move]
est nil
Si seuls X ou O sont autorisés, pourquoi ne les spécifiez-vous pas dans la condition suivante:
boared[idx] == 'X' || board[idx] == 'O'
Je pense que c'est beaucoup mieux pour la lisibilité et la simplicité.
Est-ce que
board [move]
est garanti égal à""
,""
, nil,"X"
ou"O"
? Si tel est le cas, vous pourriez écrire! Board [move] .to_s.strip.empty?
, mais c'est un hack que je ne pourrais pas recommander (cela ne fonctionne que parce quenil.to_s # => ""
). Siboard [move]
est égal à une autre valeur, que faut-il retourner?Oui.
board [move]
est garanti égal à""
,""
, nil,"X"
ou"O"
et aucune autre valeur.Avec un support actif, vous pouvez simplement utiliser
board [move] .present?