开发者

Ruby !sub returning strange null

开发者 https://www.devze.com 2023-03-21 14:38 出处:网络
I don\'t understand the result of the first line. It\'s sup开发者_如何学Pythonposed to return a file name without extension if the file has one. Can somebody explain to me why it is like that and also

I don't understand the result of the first line. It's sup开发者_如何学Pythonposed to return a file name without extension if the file has one. Can somebody explain to me why it is like that and also tell me what would be a more proper here?

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


It is documented that the sub! (like many of the ! string operations) return nil if no change was made.

From the docs

Performs the substitutions of String#sub in place, returning str, or nil if no substitutions were performed.

Instead use the regular sub. In your case the extra bang (!) is unnecessary.

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

Bang Methods

The difference between sub and sub! is subtle. But in ruby in general, the non bang (!) version of a method is safer. Since by convention the bang means the method has more side affects.

In the case of string functions (and many array/enumerable functions) the bang means the method operates on the contents of the caller, instead of making (and returning) a copy.

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

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

puts s #=> 'fafafa'

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

puts s #=> 'fofofo'
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号