From: Robert Klemme Date: 2011-09-16T19:05:38+09:00 Subject: Re: defined? var in a var name On Fri, Sep 16, 2011 at 10:04 AM, salamond wrote: > hi, all. > > I'm create a environment.rb in cucumber which stores a lot of env descripts. > like: > $host = "10.10.101.1" > $user =" root" > $password = "123" > > while some one remove something, it might cause our automation stop. > so i add 1 var checker, like > vars = ["$host", "$user", "$password"] > def check_var(var) >  raise "#{var} not defined" if !defined?(var) > end > vars.each do |var| >  check_var(var) > end > > but defined?(var) always return local-var. > > i tried eval %Q{defined?("#{var}")} Too much quoting: irb(main):002:0> var='$x' => "$x" irb(main):003:0> %Q{defined? "#{var}"} => "defined? \"$x\"" You want this: irb(main):004:0> %Q{defined? #{var}} => "defined? $x" I find the whole approach not good because of the global variables. I'd rather define a configuration class and implement validation for that so you are sure you always have proper values, e.g. class Config attr_reader :host, :user, :password def initialize(host, user, password) self.host = host self.user = user self.password = password end def host=(x) raise ArgumentError, "Invalid host %p" % p if p.nil? || p == "" # || other conditions @host = x end # etc. end Then pass around this instance. Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/