2012-11-14 3 views
-3

Почему chomp позволяет цепочки, но chomp! нет? Например:Метод chaining 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!:

грызть (разделитель = $ /) → ул или ноль

Модифицирует ул на месте, как описано для String#chomp, возвратившись ул, или nil, если никаких изменений не было сделано.

Поэтому ни chomp, ни chomp! делать то, что вы думаете. Обратите внимание:

>> 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 будет удалять только строки и возвраты каретки, отсутствующие в вашей строке. Бэг дополненный chomp возвращает ноль, потому что он не сделал никаких изменений (согласно документации).

Короче говоря, вы действительно хотели написать:

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

И:

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

Или просто переключитесь на 'strip'. –

Смежные вопросы