From: Robert Klemme Date: 2009-05-12T03:45:01+09:00 Subject: Re: File.basename bug? On 11.05.2009 20:21, Reid Thompson wrote: > On Tue, 2009-05-12 at 03:10 +0900, lasitha wrote: >> On Mon, May 11, 2009 at 9:14 PM, Reid Thompson wrote: >>> How often do people get bitten by this? >>> When operating on a file in the current directory, './' must be >>> prepended to a filename for File.basename to work... >> Hi, i'm either not understanding your issue or not seeing it on my box: >> >> $: cd /tmp; touch by.touch >> >> $: ruby19 -ve "puts File.basename 'by.touch'" >> ruby 1.9.1p0 (2009-01-30) [i386-darwin8.11.1] >> by.touch >> >> $: ruby -ve "puts File.basename 'by.touch'" >> ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin8] >> by.touch >> >>> $ cat bug.rb >>> DATAFORMAT_VERSION=1 >>> >>> def processInputFile(inputFpath) >>> puts "inputFpath #{inputFpath}" >>> dirpath = File.dirname(inputFpath) >>> >>> outputfile = File.basename(inputFpath) >>> outputfile.gsub!("pp_",'') >>> outputfile = dirpath + '/' + 'SDF_' + "#{DATAFORMAT_VERSION}" + '_' + outputfile >>> puts "outputfile #{outputfile}" >>> puts "inputFpath #{inputFpath}" >>> >>> end >>> >>> processInputFile("pp_a_test_file_name") >>> rthompso@raker>/home/rthompso >>> $ ruby bug.rb >>> inputFpath pp_a_test_file_name >>> outputfile ./SDF_1_a_test_file_name >>> inputFpath a_test_file_name >>> rthompso@raker>/home/rthompso >>> $ ruby -v >>> ruby 1.8.7 (2009-04-08 patchlevel 160) [i686-linux] >>> >>> rthompso@raker>/home/rthompso >>> $ vi bug.rb >>> rthompso@raker>/home/rthompso >>> $ ruby bug.rb >>> inputFpath /home/rthompso/pp_a_test_file_name >>> outputfile /home/rthompso/SDF_1_a_test_file_name >>> inputFpath /home/rthompso/pp_a_test_file_name >> Scanned over the above but couldn't spot what you might be on about :) >> Perhaps you could clarify or wittle the example down a bit further? >> >> cheers, >> lasitha >> > > example 1 -> processInputFile("pp_a_test_file_name") > "pp_a_test_file_name" is a string object > File.basename sets outputfile to the same object as > "pp_a_test_file_name". > as a result the gsub! action on outputfile acts on the > "pp_a_test_file_name" object. > > example 2 -> processInputFile("./pp_a_test_file_name") > "./pp_a_test_file_name" is a string object > File.basename sets outputfile to a new object as "pp_a_test_file_name". > as a result the gsub! action on outputfile acts on the new object, > without modifying the original "./pp_a_test_file_name" Heureka! It's an aliasing problem which is not there in 1.9: $ irb19 irb(main):001:0> s = 'foo.txt' => "foo.txt" irb(main):002:0> x = File.basename s => "foo.txt" irb(main):003:0> s.equal? x => false irb(main):004:0> s.object_id => 134667930 irb(main):005:0> x.object_id => 134637100 irb(main):006:0> $ irb irb(main):001:0> s = 'foo' => "foo" irb(main):002:0> x = File.basename s => "foo" irb(main):003:0> s.equal? x => true irb(main):004:0> s.object_id => 1073538940 irb(main):005:0> x.object_id => 1073538940 irb(main):006:0> Whether you consider this actually a bug of File.basename - I don't know. It is at least a documentation bug because the docs do not mention that fact. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/