2011-07-20 3 views
0

私は最初の行の結果を理解していません。ファイルに拡張子を持たないファイル名があれば、そのファイル名を返します。なぜ誰かが私にそのようなことを説明することができますか、またここでより適切なものを教えてください?Ruby!subが異常なヌルを返す

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

答えて

7

これは、サブ! (!文字列演算の多くの場合のように)変更がなければnilを返します。 docs

から

には置換が行われなかった場合は、STR、またはゼロを返す代わりに、文字列#サブの置換を行います。

代わりに通常のサブを使用してください。あなたの場合、余分なブーイング(!)は不要です。

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

バン方法

subsub!の違いは微妙です。しかし、一般的にルビーでは、メソッドの非バング(!)バージョンがより安全です。慣習的に、バンはメソッドがより多くの副作用を有することを意味するので。

文字列関数(および多くの配列/列挙可能な関数)の場合、bangは、コピーを作成(および返す)する代わりに、呼び出し元の内容に対してメソッドが動作することを意味します。

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

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

puts s #=> 'fafafa' 

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

puts s #=> 'fofofo' 
+0

ありがとうございます。それは、 '!'とメソッドを混乱させることです。別のやり方で行動する。 – gisek

+3

確かに混乱しますが、それが '!'のためです!これは、「このメソッドには奇妙な動作があります」という警告のライブラリ作成者です。一般的に、非バングバージョンのない '!'メソッド(bangメソッド)はありません。 (または少なくともそれがアイデアです) – diedthreetimes

関連する問題