On 12/22/06, Jason Mayer <slamboy / gmail.com> wrote:
> I just took a program that works using a command line argument and turned it
> into a class so that I could require it from .  Anyway, I was just wondering
> how you would pass somethign to it now as an argument.
>
> if the syntax of the original program was 'ruby program.rb Jason' and the
> program did stuff with 'Jason', how would I go about making another program
> (a GUI for example) pass along information into that program as an
> argument?  I can't seem to get this to work.  I've tried variants of the
> following:
> psuedo code (saved as program2.rb):
> 'require program.rb'
> b = 'Jason'
> a = ClassNameInProgram.new(b)
>  a = ClassNameInProgram.new {b}
>  a = ClassNameInProgram.new b
>
> If I run 'ruby program2.rb Jason', I get the same output as if I'd run '
> program.rb Jason'.  What am I not doing correctly?  Hopefully I've explained
> this adequately and hopefully I'm not being incredibly stupid.

1. if you have

class ClassName...
  def initialize
     ...ARGV[0]...
  end
end

turn it into

class ClassName....
   def initialize(*argv)
   ....argv[0]...
   end
end

or

class ClassName....
   def initialize(arg0, arg1, arg2)
   ....arg0...
   end
end

2. you can have both varieties:

do the above changes and
at the very end of the file put the following:

if __FILE__ == $0
   ClassName...new(*ARGV)
end

---
Notes:
A bit safer way is to write
if File.expand(__FILE__) == File.expand($0)
to handle program.rb vs ./program.rb cases

*ARGV "expands" the ARGV array as the actual parameters to new.
I.e. it is the same as calling new(ARGV[0], ARGV[1],...) It's a handy trick,
that can be used in case statements as well. (arr = [1,2,3], ... when *arr)

3. In the case of wrapping a script I usually split the code into
initialization (new/initialize) and actual processing
(run/process/whatever).