Dave Thomas <Dave / PragmaticProgrammer.com> writes: >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/..? [snip Dave's 4 ideas] I was looking for something similar last week. What I came up with was: 5. Convert the function to a Proc object and invoke it with the [] method. On my toy factorial problem (shown below), I only saw a difference of less than 2 percent between the running times for the direct and indirect calls. This may also be considered a candidate for the "Useless and Misleading Benchmark of the Week" award. What I was testing for was whether or not calling a simple function many times via a Proc object would be noticeably slower than the direct call. This was in the context of wanting to specialize a function at runtime based on information not available when the function was written. More specifically, I was looking to do something along the lines of partial function application in SML or a similar effect in e.g. lisp with "let" and "lambda". def fac(n) acc = 1 i = 1 while i < n i += 1 acc *= i end acc end ntimes = 5000 targ = 100 fac2 = Proc.new {|n| fac(n)} start = Time.now ntimes.times { fac targ } direct = Time.now ntimes.times { fac2[targ] } indirect = Time.now print "#{ntimes} direct calls took #{direct - start} seconds.\n" print "#{ntimes} indirect calls took #{indirect - direct} seconds.\n" Mike -- Michael Zawrotny 411 Molecular Biophysics Building Florida State University | email: zawrotny / sb.fsu.edu Tallahassee, FL 32306-4380 | phone: (850) 644-0069