2014-02-07 85 views
1

我需要在lnk.href上做很多方法才能獲得f_name。 我想編寫的代碼這種方式,但它給了我如何在Ruby中鏈接方法?

undefined method `gsub!' for nil:NilClass (NoMethodError) 

如果我不想在一行寫這些(因爲它是很難讀),什麼是Ruby的一個更好的辦法?

f_name = lnk.href.split('/').last 
     .gsub!(/[(]+/, "_") 
     .gsub!(/[)]+/, "_") 

回答

0

這不是由於語法,而只是因爲某些方法返回nil在你的情況。

+0

或''gsub!'返回'nil',以防這樣的替換被執行。 – Gumbo

6

String#gsub!回報nil如果沒有匹配:

'1'.gsub!(/2/, '_') 
# => nil 
'1'.gsub!(/2/, '_').gsub!(/1/, '_') 
# NoMethodError: undefined method `gsub!' for nil:NilClass 
#   from (irb):6 
#   from C:/Ruby200-x64/bin/irb:12:in `<main>' 

更換gsub!gsub可能會解決你的問題:

'1'.gsub(/2/, '_') 
# => "1" 
'1'.gsub(/2/, '_').gsub(/1/, '_') 
# => "_" 
0

所以,如果我理解正確的話,你正試圖寫一些你想鏈接在一個新的行,使其更具可讀性的方法?正如你發現的那樣,你不能將一個方法調用到一個新行中,因爲現在Ruby認爲你試圖在沒有任何東西的情況下調用一個方法。

我的假設是什麼,你所要完成的是這樣操作的:

lnk = <a href="https://stackoverflow.com/questions/21620460/how-to-chain-methods-in-ruby">Some Link</a> 

f_name = lnk.href.split('/').last.gsub!(/[(]+/, "_").gsub!(/[)]+/, "_") 

所以,你想找到並通過在/分裂他們分手的HTML鏈接,然後拉出並操縱URL的最後部分。

有幾件事你可以做,使這更可讀性和邏輯性。一個是修復你的正則表達式。由於您使用的是.gsub!,因此您已經在搜索所有匹配的事件,因此+是不必要的。你也可以將你的兩個電話.gsub!組合成這樣一個:.gsub!(/[()]/, "_")

這將匹配並替換所有出現的打開或關閉paren,使您的鏈一個方法更短。其餘的,我建議在合理的地方把它分成兩個步驟:在創建一個數據結構和處理數據結構之間。首先,創建子字符串數組:

f_name = lnk.href.split('/') 

然後從數組操作數據:

manipulated_substring = f_name.last.gsub!(/[()]/, "_") 

這將使你的代碼更易讀,並保持您的數據完好無損!