Newbie query regarding ruby best practice


#1

Hi all,

I’ve just finished working on a few util scripts in Ruby to cut my
teeth and I was wondering what the best practice is with regards the
use of class methods.

E.g. Is it better to do something like this…

require ‘fileutils’

FileUtils.mv(myfile,newpath)
FileUtils.cp(newpath,anotherpath)
FileUtils.rm(newpath)

or this…

fu = FileUtils.new

fu.mv(myfile,newpath)
fu.cp(newpath,anotherpath)
fu.rm(newpath)

I assume the second would only create a single instance of a
“fileutils” object, thus requiring less overhead than the first?

~Neowulf


#2

Welcome to Ruby! Regarding your question, let’s use irb try it out…

C:\irb
irb(main):001:0> require ‘fileutils’
=> true
irb(main):002:0> fu = FileUtils.new
NoMethodError: undefined method `new’ for FileUtils:Module
from (irb):2
irb(main):003:0> quit

Looks like FileUtils isn’t a class and doesn’t have a .new method. It’s
just a module that contains a bunch of handy methods for file
operations.

FileUtils has very good documentation. Use “ri FileUtils” to see it.


#3

Ah… I see. Your not really creating an instance of the object at
all.

Thanks for the heads up.

I’m really starting to enjoy coding in Ruby.

Thanks again for the help.

Cheers,

~Neowulf


#4

Neowulf wrote:

FileUtils.mv(myfile,newpath)

I assume the second would only create a single instance of a
“fileutils” object, thus requiring less overhead than the first?

~Neowulf

Or

fu = FileUtils

(without the .new)

I don’t think FileUtils.mv creates a new instance of FileUtils. These
are class methods, so you can call them directly on the class object
without instantiating the class.


#5

E.g. Is it better to do something like this…

require ‘fileutils’

FileUtils.mv(myfile,newpath)
FileUtils.cp(newpath,anotherpath)
FileUtils.rm(newpath)

Try this…

require ‘fileutils’
include FileUtils
mv(myfile, newpath)
cp(newpath,anotherpath)
rm(newpath)

If you are looking for a more concise way of using a module (which is
what FileUtils is), this is a common idiom for doing it.

Bret