如果语句可以重构为布尔运算符,如!=,==,&&和||?

时间:2019-03-22 02:25:48

标签: ruby if-statement boolean refactoring

可以将其重构为布尔值吗? board是一个数组,move是and索引。如果position_taken?(board, move)falseboard[move]" """应该返回nil,如果trueboard[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

---
- hosts: newcass
  become: yes
  become_user: root
  become_method: sudo
  gather_facts: True
  serial: 1

  tasks:
    - name: Execute CQLSH
#      shell: 'cqlsh -f /home/ubuntu/abc.cql'
      shell: 'cqlsh -f abc.cql'
#      command: "export CQLSH_NO_BUNDLED=true && cqlsh -f /home/ubuntu/abc.cql"
#      command: "cqlsh -f abc.cql"
      args:
        chdir: /home/ubuntu/
      register: cqlsh_result

    - debug:
         msg: "{{ cqlsh_result }}"

8 个答案:

答案 0 :(得分:7)

由于您的积极案例较少且较为简单,因此我会进行相反的测试:

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

它将处理无效值的方式与原始方法不同,但是它直接执行方法名称的建议:检查位置是否已接受(而不是检查位置是否未接受)。

答案 1 :(得分:3)

您可以使用none?并传递board[move]进行比较:

[' ', '', nil].none?(nil) # false
[' ', '', nil].none?('')  # false
[' ', '', nil].none?(' ') # false
[' ', '', nil].none?('t') # true

答案 2 :(得分:2)

在不知道将作为董事会参数传递什么的情况下很难知道您的方法在做什么,所以我能演示的最好的只是一个字符串:

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

答案 3 :(得分:2)

我认为这在逻辑上是等效的:

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

如果任何一个条件为true,则将其取反并返回false。如果所有条件都为假,则它将转换为真。


您还可以将要匹配的字符串放入数组中,并使用类似!include?的名称,或者,如果您使用的是ActiveSupport,则可以使用exclude?

def position_taken?(board, move)
  ["", " ", nil].exclude?(board[move])
end

答案 4 :(得分:1)

FWIW,此代码应重构为:

{% load nav %}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
        <ul class="navbar-nav mr-auto">
                {% nav_item 'dashboard' %}
            </ul>

答案 5 :(得分:1)

如果只允许使用X或O,为什么不以这样的条件指定它们:

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

我认为它在可读性和简单性方面要好得多。

答案 6 :(得分:-1)

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

答案 7 :(得分:-1)

找到了解决方案。可以重构为:

v-on="listeners"