3
votes

Les instructions if peuvent-elles être refactorisées en opérateurs booléens comme! =, ==, && et ||?

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


3 commentaires

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 que nil.to_s # => "" ). Si board [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?


8 Réponses :


2
votes

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


0 commentaires

2
votes

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


4 commentaires

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.



3
votes

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


2 commentaires

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.



1
votes

FWIW, ce code doit être remanié en:

def position_taken?(board, move)
  not board[move].to_s.strip.empty?
end


3 commentaires

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.



7
votes

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).


0 commentaires

-1
votes
def position_taken?(board, move)
  !case board[move]; when " ", "", nil; true end
end

2 commentaires

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.



-1
votes

J'ai trouvé la solution. Il peut être remanié comme suit:

def position_taken?(board, move)
  board[move] != " " && board[move] != ""
end


1 commentaires

qui renvoie vrai si board [move] est nil



1
votes

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é.


0 commentaires