2012-09-05 31 views
0

我必須使用String.scan函數,如果沒有匹配,它將返回空數組。更好的方法來做分配和檢查結果

我想分配一個變量與掃描功能,並檢查它是否有匹配,但不幸的是我不能這樣做,因爲它不會返回無匹配的零或假。

我想做到這一點(1號線):

if ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) 
    ... 
    #use ip 
end 

,而是因爲它不會在沒有匹配返回nil我必須做到:

ip_match = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) 
unless ip_match.empty? 
    #use ip 
end 

有一些更優雅的方式來寫這個 - 能夠同時進行賦值和空檢查,或者其他方式來美化代碼?

感謝

+0

您的IP驗證似乎是本週退房的http://計算器。 COM /問題/ 3756184 /導軌-3-驗證-IP串 – PriteshJ

回答

2

由於掃描返回一個數組,即使你肯定會有結果只有一個,你可以做到這一點。

str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/).each do |ip| 
    #use ip 
end 
1

優雅和神祕或「簡潔」之間有區別。

在Perl中,你經常會看到人們寫的東西相當於:

if (!(ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)).empty?) 

這是一個有點更簡潔,簡潔,嚴密,無論你怎麼稱呼它。由於=(等於)與通常應該進行的平等測試相比,它也會導致維護問題。如果代碼被傳遞給不瞭解邏輯的人,他們可能會錯誤地「糾正」該代碼,然後破壞代碼。

在Ruby中,由於維護問題,在條件測試中不使用equatematic,而是使用賦值後跟測試。代碼更清晰。

就個人而言,我更喜歡在這種情況下不使用unless。這是一個持續的討論,unless是否有助於生成更易於理解的代碼;我更喜歡if (!ip_match.empty?),因爲它更像我們通常會說的話 - 我很少在對話中開始與unless對話。你的里程可能有所不同

1

我會用String幫手match

ip_validator = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ 

# match return nil if no match 

if str.match ip_validator 
    # blah blah blah..... 
end 

幫助我保持代碼的乾燥和清潔最好做這樣的事情。 可能這還不是最優雅的,找別人,如果任何:)

你ip_validator正則表達式似乎是上週檢查了這一點Rails 3: Validate IP String