From: lists Date: 2009-03-19T10:11:19+09:00 Subject: Re: Is this how you start a hash? On Mar 18, 2009, at 7:50 PM, Power One wrote: > I'm looking at the code below but still not clear about how this hash > forms! The author of a ruby book I read claimed that the code forms > hash. Is it? > > #not complete code, if you try to use it, it won't work! > > require 'yaml' > require 'wordplay' > > class Bot > attr_reader :name > > def initialize(options) > @name = options[:name] || "Unnamed Bot" > begin > @data = YAML.load(File.read(options[:data_file])) > rescue > raise "Can't load bot data" > end > end > end > > So, when you created hash, don't you have to initialize it with an > empty > hash? For example: @name = {}? > > Also when I try to use a snippet in irb: > @name = options[:name] || "Unnamed Bot" > NameError: undefined local variable or method `options' for > main:Object > from (irb):1 > from :0 > > options is also in File.read(), it's acting like adding more element > to > a hash. Am I right? Though irb tells a different story as if it's > not > how you starting a hash. > > I'm confused! > -- > Posted via http://www.ruby-forum.com/. > > Yes, you'd normally create a new has with either Hash.new or hash = {}. The method above is expecting that an already populated Hash be passed as its argument (internally referred to as the options variable). So here's how you'd use the Bot class: Bot.new(:name => 'My Bot', :data_file => '/tmp/file.yml') Maybe this helps you see the Hash more clearly: Bot.new({:name => 'My Bot', :data_file => '/tmp/file.yml'}) or even: my_options = {:name => 'My Bot', :data_file => '/tmp/file.yml'} Bot.new(my_options) Hope this helps.