2011-07-20 32 views
0

我不明白第一行的結果。如果文件有一個,它應該返回一個沒有擴展名的文件名。有人可以向我解釋爲什麼它是這樣的,並告訴我什麼會更合適嗎?Ruby!sub返回奇怪的null

irb(main):003:0> 'fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '') 
=> nil 
irb(main):004:0> '.fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '') 
=> "" 
irb(main):005:0> 'fafeafeafewafea.wfeaw'.sub!(/\.[^\.]*$/, '') 
=> "fafeafeafewafea" 

回答

7

據記載,sub! (就像許多字符串操作一樣)如果沒有改變,就返回nil。

docs

執行到位串#子,返回海峽,或的替代,如果進行沒有換人。

改爲使用常規子。在你的情況下,額外的爆炸(!)是不必要的。

'fafeafeafewafeawfeaw'.sub(/\.[^\.]*$/, '')

爆炸方法

subsub!之間的差別是很微妙的。但是在一般的紅寶石中,方法的非爆炸(!)版本更安全。由於按照慣例,爆炸意味着該方法具有更多的副作用。

在字符串函數(和許多數組/可枚舉函數)的情況下,bang意味着該方法對調用者的內容進行操作,而不是製作(並返回)副本。

s = 'fafafa' 
puts s #=> 'fafafa' 

puts s.sub(/fa/, 'fo') #=> 'fofofo' 

puts s #=> 'fafafa' 

puts s.sub!(/fa/, 'fo') #=> 'fofofo' 

puts s #=> 'fofofo' 
+0

謝謝,你說得對。使用'!'的方法有點令人困惑表現方式不同。 – gisek

+3

確實令人困惑,但這就是'!'的用途!這是一個圖書館作者,警告你'嘿,這種方法有奇怪的(呃)行爲'。一般來說,不會有沒有非爆炸版本的'!'方法(爆炸方法)。 (或者至少是這個想法) – diedthreetimes