File.basename

File.open('myfile') do |f|
    puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
http://ruby-doc.org/core/classes/File.html
advertise the basename method)

[ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]]

Thanks!

You do have FileUtils installed and required, yes?

require 'ftools'

···

On 2010-07-20 10:08:40 -0400, James O'Brien said:

[Note: parts of this message were removed to make it a legal post.]

File.open('myfile') do |f|
    puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

[ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]]

Thanks!

--
Thank you for your brain.
-MrZombie

It's a class method, not an instance method.

File.open('myfile') do |f|
  puts File.basename(f)
end

···

On Tue, Jul 20, 2010 at 11:08:40PM +0900, James O'Brien wrote:

File.open('myfile') do |f|
    puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

--
Daniel Bye
                                                                     _
                                              ASCII ribbon campaign ( )
                                         - against HTML, vCards and X
                                - proprietary attachments in e-mail / \

Because it's a class method, not an instance method. That is, you should use
it as follows:

File.basename("foo.bar")

HTH,
Yaser

···

On Tue, Jul 20, 2010 at 5:08 PM, James O'Brien <jeob32@gmail.com> wrote:

File.open('myfile') do |f|
   puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

You're looking at the docs for the class method File.basename, but you're calling basename on an instance of File referenced by f

puts File.basename('myfile')

or better:

puts File.basename('/some/long/path/to/myfile')

-Rob

Rob Biedenharn
Rob@AgileConsultingLLC.com http://AgileConsultingLLC.com/
rab@GaslightSoftware.com http://GaslightSoftware.com/

···

On Jul 20, 2010, at 10:08 AM, James O'Brien wrote:

File.open('myfile') do |f|
   puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

[ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]]

Thanks!

File.open('myfile') do |f|
  puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

[ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]]

Thanks!

You're looking at the docs for the class method File.basename, but you're calling basename on an instance of File referenced by f

puts File.basename('myfile')

or better:

puts File.basename('/some/long/path/to/myfile')

Actually, a better example (and likely closer to what you expected):

puts File.basename(f.path)

···

On Jul 20, 2010, at 10:52 AM, Rob Biedenharn wrote:

On Jul 20, 2010, at 10:08 AM, James O'Brien wrote:

-Rob

Rob Biedenharn
Rob@AgileConsultingLLC.com http://AgileConsultingLLC.com/
rab@GaslightSoftware.com http://GaslightSoftware.com/

Yep yep silly me... THANKS everyone!

···

On Tue, Jul 20, 2010 at 3:52 PM, Rob Biedenharn <Rob@agileconsultingllc.com>wrote:

On Jul 20, 2010, at 10:08 AM, James O'Brien wrote:

File.open('myfile') do |f|

  puts f.basename;
end

myfile exists on the filesystem but this code blows up with

undefined method `basename'

could someone explain why (given the docs
class File - RDoc Documentation
advertise the basename method)

[ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]]

Thanks!

You're looking at the docs for the class method File.basename, but you're
calling basename on an instance of File referenced by f

puts File.basename('myfile')

or better:

puts File.basename('/some/long/path/to/myfile')

-Rob

Rob Biedenharn
Rob@AgileConsultingLLC.com http://AgileConsultingLLC.com/
rab@GaslightSoftware.com http://GaslightSoftware.com/

Yep yep silly me... THANKS everyone!

And THAT is why I personally quit using File a long time ago. I encourage you to take a close look at Pathname, which I found put the various methods where I thought they should have been in the first place.

require 'pathname'
myFile = Pathname.new("/some/path/to/file.ext")
myFile.basename

=> "file.ext"

.delete, .dirname, .atime, .executable?, .exists?, .extname, and on and on are properties of specific files, so having the methods on the instance, instead of the class, just makes all kinds of sense to me.

Pathname only has three class methods, including new. Vastly more intuitive to me.

···

On Jul 20, 2010, at 8:07 , James O'Brien wrote: