2012-11-14 59 views
-3

爲什麼chomp允許鏈接,但chomp!不是?例如:鏈接chomp/chompbang的方法

"HELLO ".chomp.downcase 
#> hello 
"HELLO ".chomp!.downcase 
#> nil 

另一個有趣的例子:

"100 ".chomp.to_i 
#> 100 
"100 ".chomp!.to_i 
#> 0 
爲什麼字符串出現這種情況

任何想法,爲什麼nil.to_i回報0

+0

1)你的例子是錯誤的。 2)你應該分開你的兩個問題。 – sawa

回答

2

fine manual

格格(分隔符= $ /)→new_str

返回一個新的String,從str(如果存在)的末尾刪除給定的記錄分隔符。如果$/尚未從默認的Ruby記錄分隔符更改,則chomp也會刪除回車符(即它將刪除\n\r\r\n)。

chomp!

格格(隔膜= $ /)→STR或零

:修改STR代替作爲用於String#chomp描述,返回STR,或者如果沒有修改則爲nil

因此,chompchomp!都不會做你認爲他們做的事。注意:

>> s = '100 ' 
=> "100 " 
>> s.chomp 
=> "100 " 
>> s 
=> "100 " 
>> s.chomp! 
=> nil 
>> s 
=> "100 " 

所以沒有人在乎,除非你告訴他們,他們只是去掉默認尾隨EOLS尾隨空格。

'100 '.chomp!返回nil,因爲這就是文檔所說的。沒有進行替換,因此它返回nil

爲什麼nil.to_i會讓你零?那麼,從fine manual

to_i→0

始終返回零。

這不會給模糊或解釋留下太多空間。

我想你了strip家庭的方法,而不是chomp後實際上是:

那些從字符串中刪除空白。

2

如果你記得提供chomp參數,你的問題就會消失。沒有人,chomp將只刪除換行符和回車符,這些符號在字符串中不存在。 bang擴充的chomp返回nil,因爲它沒有做任何修改(按照文檔)。

簡單地說,你真的想寫:

"HELLO ".chomp(" ").downcase 
=> hello 

和:

"HELLO ".chomp!(" ").downcase 
=> hello 
+1

或者只是切換到'strip'。 –