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).