ruby 用于捕获条件赋值的Rubocop

bnlyeluc  于 2023-06-22  发布在  Ruby
关注(0)|答案(2)|浏览(173)

我们有一些代码在生产中咬了我们,我想知道是否有一种方法可以在未来防止它。我们正在使用Ruby和rubocop,但我可以找到一个警察,以满足我的需要。
代码如下所示:

a = 1
b = 1
return ((a == 1) || (b = 2)) # should return a boolean, false in  this case

第3行是我们遇到问题的地方,我们在计算布尔值时遗漏了一个等号(所以它是一个单等号而不是双等号)。
在ruby或rubocop中,有没有现成的东西可以用来捕捉这个错误?
谢谢

j1dl9f46

j1dl9f461#

这些被视为赋值,它不能确保和确认用户正在提供赋值或他正在验证相等性。
我遇到过类似的事情(不同的用例),我通过创建自定义COP扩展实现。
这不是一个值得赞赏的方式来覆盖现有的功能,但无论如何,你可以通过创建自己的扩展来定义自定义的警察来实现这一点。
例如你可以创建一个新的ruby-rubocop文件,如assignment_mistake_correction_cop. rb,你可以在这个文件中进行必要的修改。
在yaml文件中,可以包括如下文件

. rubocop. yml

require:'./assignment_error_correction_cop. rb'
作为assignment_mistake_correction_cop文件的示例更改,检查下面的代码,我已经实现了一些其他用例,此代码将根据您的要求进行更新。

# assignment_mistake_correction_cop.rb
require 'rubocop'

module RuboCop
  module Cop
    module CustomWrittenCops
      class AssignmentMistakeCorrectionCop < Cop

        MSG = 'Assignment mistake . Use `==` for comparison instead of `=`.'.freeze

        def on_send(node)
          receiver, method_name, *args = *node
          return if  !(method_name == :return && args.size == 1)

          arg = args.first

          receiver, method_name, *args = *arg

          arg1, arg2 = args

          if assignment_has_a_mistake?(arg1)
            add_offense(arg1, location: :expression)
          elsif assignment_has_a_mistake?(arg2)
            add_offense(arg2, location: :expression)
          end

        end

        private

        def assignment_has_a_mistake?(val)
          val.assignment?
        end
      end
    end
  end
end

注意:这是一个我根据你的用例修改的示例代码。
更多的参考资料,也许你可以看看rubocop/cop/corrector.rb文件。
这里,校正器类负责应用修正(即,自动校正修正)。

tyky79it

tyky79it2#

有一个cop Lint/AssignmentInCondition。如果你写了:

return if a == 1 || b = 2

那么它会报告:

Use == if you meant to do a comparison or wrap the expression in parentheses to indicate you meant to assign in a condition.

但是由于表达式已经被 Package 在(不必要的)括号中,RuboCop忽略了这一点。

相关问题