如何在不引发RuboCop警告的情况下使用正则表达式

时间:2017-03-02 09:04:56

标签: ruby regex rubocop

这是一种正则表达式模式:

(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0

RuboCop建议使用.zero?代替== 0。但是当正则表达式不匹配时,它将返回nil。然后nil.zero?会为.zero?"提出一个未定义的方法nil。错误。有没有更好的方法在ruby中做正则表达式?

5 个答案:

答案 0 :(得分:8)

并非所有来自rubocop的小费都是一个很好的提示。

在Ruby 2.4中:

@location.match? /\A#[a-zA-Z0-9]*\Z/

顺便说一句,你想要/\Z/(一行以字符串末尾结尾)或/\z/(字符串末尾)?

答案 1 :(得分:4)

假设您运行ruby 2.3.0 +:

(@location =~ /\A#[a-zA-Z0-9]*\Z/)&.zero?

另外根据您的具体情况,您似乎想要检查您是否完全匹配。因此,您根本不需要检查起始位置是否完全0

do_something if @location =~ /\A#[a-zA-Z0-9]*\Z/

答案 2 :(得分:3)

您正在尝试解决不存在的问题。由于锚\A,确实有两种可能的回报:0nil。那说:

!(@location =~ /\A#[a-zA-Z0-9]*\Z/).nil?

甚至

!!(@location =~ /\A#[a-zA-Z0-9]*\Z/)

甚至更好:

@location[/\A#[a-zA-Z0-9]*\Z/]

答案 3 :(得分:0)

这是一个已知的误报,因为#=~不遵守鸭子类型的原则,即它具有不兼容的返回值签名。

关于如何重写代码,已经有一些很好的答案,而这正是RuboCop的全部内容,但有时重写会导致代码变得更糟。对于这些情况,标记误报的一般方法是使用禁用:

(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0 # rubocop:disable Style/NumericPredicate

答案 4 :(得分:0)

我建议采用以下解决方案:

/\A#[a-zA-Z0-9]*\Z/.match?(@location)

这将保护@locationnil时的情况并使rubocop满意。