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

3
这是一个正则表达式模式:
(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0

RuboCop建议使用.zero?而不是== 0。但是当正则表达式不匹配时,它会返回nil。然后nil.zero?会抛出一个"undefined method .zero? for nil"的错误。有更好的方法在ruby中使用正则表达式吗?

5个回答

8

并不是rubocop中的每个提示都是好的提示。

在Ruby 2.4中:

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

顺便问一下,你需要的是字符串末尾的换行符/\Z/还是字符串的结尾/\z/


2
点赞“不是来自rubocop的每个提示都是好提示。”我有一个配置文件,比原始文件肥5倍。 - Aleksei Matiushkin

4
假定您正在运行 Ruby 2.3.0 或更高版本:
(@location =~ /\A#[a-zA-Z0-9]*\Z/)&.zero?

另外根据您的具体情况,您似乎想要检查是否完全匹配。因此,您根本不需要检查起始位置是否为0
do_something if @location =~ /\A#[a-zA-Z0-9]*\Z/

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/]

不确定为什么要在前面加“!”,他只需要检查(@location =~ /\A#[a-zA-Z0-9]*\Z/)是否为空,如果是这种情况,则不需要使用“!”符号。 - Tamer Shlash
@TamerShlash在Ruby中没有“blank”这个概念。他需要检查@location是否与正则表达式在第一个位置匹配。 - Aleksei Matiushkin

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

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

这将保护当@locationnil的情况,并使rubocop感到满意。


0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接