这是一种正则表达式模式:
(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0
RuboCop建议使用.zero?
代替== 0
。但是当正则表达式不匹配时,它将返回nil
。然后nil.zero?
会为.zero?
"提出一个未定义的方法nil
。错误。有没有更好的方法在ruby中做正则表达式?
答案 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
,确实有两种可能的回报:0
和nil
。那说:
!(@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)
这将保护@location
为nil
时的情况并使rubocop满意。