Можно ли реорганизовать операторы в логические операторы, такие как! =, ==, && и ||? - PullRequest
3 голосов
/ 22 марта 2019

Может ли это быть преобразовано в логическое значение?board - это массив, а move - это и индекс.position_taken?(board, move) должен вернуть false, если board[move] равно " ", "" или nil, но вернуть true, если board[move] равно "X" или "O".

def position_taken?(board, move)
  if board[move] == " "
    false
  elsif board[move] == ""
    false
  elsif board[move] == nil
    false
  else
    true
  end
end

Ответы [ 8 ]

7 голосов
/ 22 марта 2019

Так как у вас меньше и проще положительных случаев, я бы проверил на обратное:

def position_taken?(board, move)
  %w[X O].include?(board[move])
end

Он будет обрабатывать недопустимые значения иначе, чем ваш первоначальный подход, но он делает непосредственно то, что предлагает имя метода: проверьте, еслипозиция занята (вместо проверки, если позиция не занята).

3 голосов
/ 22 марта 2019

Вы можете использовать none? и передать board[move] для сравнения:

[' ', '', nil].none?(nil) # false
[' ', '', nil].none?('')  # false
[' ', '', nil].none?(' ') # false
[' ', '', nil].none?('t') # true
2 голосов
/ 22 марта 2019

Я думаю, что это логически эквивалентно:

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

Если какое-либо из условий выполняется, оно будет инвертировано и вернет false.Если все условия ложные, оно будет инвертировано в истинное.


Вы также можете поместить строки, с которыми вы хотите сопоставить, в массив и использовать что-то вроде !include? или, если выПовторно используя ActiveSupport, вы можете использовать exclude?.

def position_taken?(board, move)
  ["", " ", nil].exclude?(board[move])
end
2 голосов
/ 22 марта 2019

Трудно понять, что делает ваш метод, не зная, что вы передадите в качестве аргумента доски, поэтому лучшее, что я могу продемонстрировать, это просто строка:

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
1 голос
/ 26 марта 2019

Если разрешены только X или O, почему бы вам не указать их в таком состоянии:

boared[idx] == 'X' || board[idx] == 'O'

Я думаю, что это намного лучше для удобочитаемости и просто.

1 голос
/ 22 марта 2019

FWIW, этот код должен быть изменен на:

def position_taken?(board, move)
  not board[move].to_s.strip.empty?
end
0 голосов
/ 26 марта 2019

Нашел решение.Это может быть изменено следующим образом:

def position_taken?(board, move)
  board[move] != " " && board[move] != ""
end
0 голосов
/ 22 марта 2019
def position_taken?(board, move)
  !case board[move]; when " ", "", nil; true end
end
...