2017-03-02 17 views
3

這是一個正則表達式模式:如何使用正則表達式,而不養RuboCop警告

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

RuboCop建議使用.zero?而不是== 0。但是當正則表達式不匹配時,它將返回nil。然後nil.zero?將拋出「未定義的方法.zero?nil」錯誤。任何更好的方式來做ruby的正則表達式?

回答

4

假設你運行Ruby 2.3.0+:

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

而且按照您的具體情況,你似乎要檢查你有一個精確匹配。因此,你不需要檢查起始位置正好是在0所有:

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

不是從rubocop每一個技巧是一個很好的提示。

在Ruby 2.4:

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

順便說一句,你想/\Z//\z/(字符串的結束)(線在字符串的結尾結束)?

+2

Upvoted for「不是每一個來自rubocop的提示都是一個很好的提示。」我有一個配置文件,它比原始文件多5倍。 – mudasobwa

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

@EricDuminil確實,謝謝:) – mudasobwa

+0

不知道爲什麼'!'之前,他只需要檢查'(@location =〜/ \ A#[a-zA-Z0-9] * \ Z /)'是否爲空在這種情況下你不需要'!'。 –

+0

@TamerShlash紅寶石中沒有「空白」的概念。他需要檢查'@ location'是否與第一個位置的正則表達式匹配。 – mudasobwa

0

這是是因爲#=~不堅持鴨打字的原則,已知的假陽性,即它具有不兼容的返回值簽名。

關於如何重寫代碼已經有了一些很好的答案,這實際上就是RuboCop的全部內容,但有時候重寫會導致代碼更糟糕。對於這些情況,標誌着誤報的通用方法是使用禁用:

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

我提出以下解決方案:

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

這將保障的情況下@locationnil並會使rubocop高興。