Ruby!sub返回奇怪的null

And*_*Gis 0 ruby

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

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

die*_*mes 7

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

来自文档

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

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

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

Bang方法

sub和之间的区别sub!是微妙的.但是在ruby中,方法的非爆炸(!)版本更安全.因为按照惯例,爆炸意味着该方法具有更多的副作用.

在的字符串函数(和许多阵列/枚举函数)的情况下的爆炸装置的方法呼叫者的内容进行操作,而不是使(和返回)的副本.

s = 'fafafa'
puts s #=> 'fafafa'

puts s.sub(/fa/, 'fo') #=> 'fofofo'

puts s #=> 'fafafa'

puts s.sub!(/fa/, 'fo') #=> 'fofofo'

puts s #=> 'fofofo'
Run Code Online (Sandbox Code Playgroud)

  • 确实令人困惑,但这就是`!`的用途!这是一个图书馆作者警告你'嘿这个方法有奇怪的(呃)行为'.一般来说,没有非爆炸版本的`!`方法(爆炸方法).(或至少这是个想法) (3认同)