Ruby!sub返回奇怪的null

时间:2011-07-20 18:21:39

标签: ruby

我不明白第一行的结果。如果文件有文件名,则应该返回没有扩展名的文件名。有人可以向我解释为什么会这样,并告诉我这里更合适的是什么?

irb(main):003:0> 'fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '')
=> nil
irb(main):004:0> '.fafeafeafewafeawfeaw'.sub!(/\.[^\.]*$/, '')
=> ""
irb(main):005:0> 'fafeafeafewafea.wfeaw'.sub!(/\.[^\.]*$/, '')
=> "fafeafeafewafea"

1 个答案:

答案 0 :(得分:7)

据记载,分! (与许多!字符串操作一样)如果没有进行任何更改,则返回nil。

来自docs

  
    

如果没有执行替换,则执行String#sub的替换,返回str或 nil

  

而是使用常规子。在你的情况下,额外的爆炸(!)是不必要的。

'fafeafeafewafeawfeaw'.sub(/\.[^\.]*$/, '')

Bang Methods

subsub!之间的差异很微妙。但是在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'