方法链接chomp / chompbang

时间:2012-11-14 02:31:32

标签: ruby

为什么chomp允许链接但chomp!不允许链接?例如:

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

另一个有趣的例子:

"100 ".chomp.to_i
#> 100
"100 ".chomp!.to_i
#> 0

为什么会在字符串上出现此行为的任何想法,以及为什么nil.to_i会返回0

2 个答案:

答案 0 :(得分:2)

如果你记得为chomp提供一个论点,你的问题就会消失。没有一个,chomp只会删除你的字符串中不存在的换行符和回车符。 bang augmented chomp返回nil,因为它没有做任何修改(根据文档)。

简而言之,你真的想写:

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

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

答案 1 :(得分:2)

来自fine manual

  

chomp(separator = $ /)→new_str

     

返回一个新的String,其中从 str (如果存在)的末尾删除了给定的记录分隔符。如果$/未从默认的Ruby记录分隔符更改,则chomp也会删除回车符(即将删除\n\r和{{1 }})。

chomp!

  

chomp!(separator = $ /)→str或nil

     

\r\n所述修改 str ,返回 str ,如果未进行任何修改,则修改String#chomp

因此,nilchomp都不会按照您的想法行事。观察:

chomp!

因此,除非你告诉他们,否则没有人关心尾随空格,他们只是默认剥离尾随的EOL。

>> s = '100 ' => "100 " >> s.chomp => "100 " >> s => "100 " >> s.chomp! => nil >> s => "100 " 会返回'100 '.chomp!,因为这就是文档所说的内容。没有替换,因此返回nil

为什么nil会给你零?好吧,来自fine manual

  

to_i→0

     

始终返回零。

这不会给模糊或解释留下太多空间。

我认为你实际上是在nil.to_i系列方法之后而不是strip

从字符串中删除空格。