我不明白第一行的结果。如果文件有文件名,则应该返回没有扩展名的文件名。有人可以向我解释为什么会这样,并告诉我这里更合适的是什么?
irb(main):003:0> 'fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '')
=> nil
irb(main):004:0> '.fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '')
=> ""
irb(main):005:0> 'fafeafeafewafea.wfeaw'.sub!(/\.[^\.]*$/, '')
=> "fafeafeafewafea"
答案 0 :(得分:7)
据记载,分! (与许多!字符串操作一样)如果没有进行任何更改,则返回nil。
来自docs
如果没有执行替换,则执行String#sub的替换,返回str或 nil 。
而是使用常规子。在你的情况下,额外的爆炸(!)是不必要的。
'fafeafeafewafeawfeaw'.sub(/\.[^\.]*$/, '')
sub
和sub!
之间的差异很微妙。但是在ruby中,方法的非爆炸(!)版本更安全。因为按照惯例,爆炸意味着该方法有更多的副作用。
对于字符串函数(以及许多数组/可枚举函数),bang意味着该方法对调用者的内容进行操作,而不是制作(并返回)副本。
s = 'fafafa'
puts s #=> 'fafafa'
puts s.sub(/fa/, 'fo') #=> 'fofofo'
puts s #=> 'fafafa'
puts s.sub!(/fa/, 'fo') #=> 'fofofo'
puts s #=> 'fofofo'