Style/ConditionalAssignment:使用条件的return进行变量赋值和比较

Style/ConditionalAssignment: Use the return of the conditional for variable assignment and comparison

下面是我在 Rails 上的 Ruby 代码 -

inactive_list = [1,2,3,4,5]
raw_data = []

data = {
  name: "Test",
  full_name: "Test data"
}
if inactive_list.include? <<id of data>>
  data[:active] = false
else
  data[:active] = true
end

raw_data << data

我收到 if...else 语句的 Rubocop linting 错误。我尝试进行多项更改,但无法修复 linting Rubocop 错误。

C: Style/ConditionalAssignment: Use the return of the conditional for variable assignment and comparison.

而不是

if inactive_list.include? <<id of data>>
  data[:active] = false
else
  data[:active] = true
end

你可以写

data[:active] = !inactive_list.include? <<id of data>>

或者当你使用 Rails 时,你可以使用 exclude? 而不是 include? 的否定:

data[:active] = inactive_list.exclude? <<id of data>>

完整示例:

data = {
  name: "Test",
  full_name: "Test data",
  active: inactive_list.exclude?(<<id of data>>)
}

一般来说,Style/ConditionalAssignment rubocop 规则 (cop) 要求您更改这 2 个重复分配:

if condition
  variable = value1
else
  variable = value2
end

单个条件赋值:

variable = if condition
             value1
           else
             value2
           end

在你的例子中,最小的 Rubocop 需要的改变是改变这个:

if inactive_list.include? <<id of data>>
  data[:active] = false
else
  data[:active] = true
end

至:

data[:active] = if inactive_list.include? <<id of data>>
                  false
                else
                  true
                end

请参阅@spickermann 的回答以获得更短和更优雅的进一步更改,这是可能的,因为 include? returns truefalse,恰好是你需要什么任务。所以你不需要在这里显式分配 truefalse,只需使用 ! 取反即可,这是一种常见的编程习惯用法:

data[:active] = !inactive_list.include? <<id of data>>

另请参见:

数组include?方法:https://ruby-doc.org/core-2.7.0/Array.html#method-i-include-3F

RuboCop::Cop::Style::ConditionalAssignment : https://www.rubydoc.info/github/bbatsov/RuboCop/RuboCop/Cop/Style/ConditionalAssignment

检查if和case语句,其中每个分支都用于赋值给同一个变量,当使用条件的return时可以代替