這是一個正則表達式模式:如何使用正則表達式,而不養RuboCop警告
(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0
RuboCop建議使用.zero?
而不是== 0
。但是當正則表達式不匹配時,它將返回nil
。然後nil.zero?
將拋出「未定義的方法.zero?
爲nil
」錯誤。任何更好的方式來做ruby的正則表達式?
這是一個正則表達式模式:如何使用正則表達式,而不養RuboCop警告
(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0
RuboCop建議使用.zero?
而不是== 0
。但是當正則表達式不匹配時,它將返回nil
。然後nil.zero?
將拋出「未定義的方法.zero?
爲nil
」錯誤。任何更好的方式來做ruby的正則表達式?
假設你運行Ruby 2.3.0+:
(@location =~ /\A#[a-zA-Z0-9]*\Z/)&.zero?
而且按照您的具體情況,你似乎要檢查你有一個精確匹配。因此,你不需要檢查起始位置正好是在0
所有:
do_something if @location =~ /\A#[a-zA-Z0-9]*\Z/
不是從rubocop每一個技巧是一個很好的提示。
在Ruby 2.4:
@location.match? /\A#[a-zA-Z0-9]*\Z/
順便說一句,你想/\Z/
或/\z/
(字符串的結束)(線在字符串的結尾結束)?
您試圖解決不存在的問題。由於爲\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/]
這是是因爲#=~
不堅持鴨打字的原則,已知的假陽性,即它具有不兼容的返回值簽名。
關於如何重寫代碼已經有了一些很好的答案,這實際上就是RuboCop的全部內容,但有時候重寫會導致代碼更糟糕。對於這些情況,標誌着誤報的通用方法是使用禁用:
(@location =~ /\A#[a-zA-Z0-9]*\Z/) == 0 # rubocop:disable Style/NumericPredicate
我提出以下解決方案:
/\A#[a-zA-Z0-9]*\Z/.match?(@location)
這將保障的情況下@location
是nil
並會使rubocop高興。
Upvoted for「不是每一個來自rubocop的提示都是一個很好的提示。」我有一個配置文件,它比原始文件多5倍。 – mudasobwa