On Thursday 28 August 2008 15:08:01 Thomas B. wrote:

> ALLOWED=[:foo,:bar]
> input=gets.downcase.chomp.to_sym
> if ALLOWED.include? input
>   send(input)
> else
>   puts "That isn't a command!"
> end

Subtle memory leak here: A symbol, once defined, is never collected. (Unless 
this has changed, but I don't see how it could...) They have many advantages, 
and I'd still use them in code, but don't use them with user input. Instead:

ALLOWED = %w{foo bar}.map(&:freeze).freeze
input = gets.downcase.chomp
if ALLOWED.include? input
  send input
else
  puts "'#{input}' isn't a command!"
end

A possible performance hack is to use a Set instead, but I'm not sure how 
large the array has to be for this to actually be faster:

require 'set'
ALLOWED = Set.new(%w{foo bar}).freeze


And yes, "send" seems to work with strings. No point in casting to a symbol if 
you're only going to be using it for one send call.


Of course, I wouldn't worry about it if you're only accepting input from one 
user, at the commandline -- they'd have to bang on the keyboard quite awhile 
to use any significant amount of RAM.

But it's something to consider when building any kind of long-running service.