Alex McHale <lists / theorigin.org> writes:

>   I'm looking to put a method in an array, to be called at a later time.  
> In C, this is possible using pointers (through some rigamarole and 
> typedefs, it would  look like { funct }).  Is there any way this can 
> similarly be acheived in Ruby?
>   What the end goal is to be able to call the method using 'arr[index] 
> args'.  The purpose of this is that I'm working on a server that might 
> receive one of hundreds of commands from the client side, and this:

...

>   Is this possible?  Is there a better solution for command recognition 
> without endless if/elsif/..?

You've got lots of options.

1. You can construct a set of classes, each with a method called (say) 
   'run', and then assign an object of each class to elements of a
   hash.

     cmdtab = {
       'start' => StartCmd.new,
       'end'   => EndCmd.new
     }

     cmdtab[cmd].run(args...)

2. You can have a set of anonymous procedures which do the work for
   each command, and then put them in a hash:

    cmdtab = {
       'start' => proc { doStart() },
       'end'   => proc { exit(0)   }
     }

    cmdtab[cmd].call(args...)

3. You can write a method with the same name, and put all the methods
   in to a class, then use Object#send to invoke the correct method by 
   name:

    class Command

      def start(arg1, arg2)
        ..
      end

      def end(arg1, ..)
        ..
      end
    end

    cmdHandler = Command.new

    cmdHandler.send(cmd, arg...)

4. You could write each command in a global function and use 'eval' to 
   invoke it (potentially very risky)


You might also want to look at 'method_missing' as a way of handling
method calls.


Regards


Dave