为什么chomp
允许链接但chomp!
不允许链接?例如:
"HELLO ".chomp.downcase
#> hello
"HELLO ".chomp!.downcase
#> nil
另一个有趣的例子:
"100 ".chomp.to_i
#> 100
"100 ".chomp!.to_i
#> 0
为什么会在字符串上出现此行为的任何想法,以及为什么nil.to_i
会返回0
?
答案 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
。
因此,nil
和chomp
都不会按照您的想法行事。观察:
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
:
从字符串中删除空格。