From: Johan Eriksson Date: 2008-04-26T03:45:00+09:00 Subject: Re: undefined local variable Hi -- David A. Black wrote: > Hi -- > > On Sat, 26 Apr 2008, Johan Eriksson wrote: > >> Chris Hulan wrote: >>> On Apr 25, 11:16 am, Johan Eriksson wrote: >>>> Hi! >>>> >>>> I have some troubles with this. >>>> >>>> obj_as_list.each do |att| >>>> if att[1].is_a?(String) >>>> att[1] = "'#{att[1]'" >>> You're missing a '}' here ----------^ >>> >>> does that help? >>> >> >> Nope. I am providing the surrounding function here. (It is defined >> inside a class.) >> >> def load_from_file(filename) >> require 'yaml' >> yaml_dict = YAML::load(File.open(filename)) >> object_list = [] #The list that should be returned >> yaml_dict[yaml_dict.keys[0]].each do |yaml_obj| >> new_obj = self.class.new >> yaml_obj.each do |obj| >> obj_as_list = obj.to_a >> obj_as_list.each do |att| >> if att[1].is_a?(String) >> att[1] = "'#{att[1]}'" >> end >> str = "new_obj.#{att[0]} = #{att[1]}" >> eval(str) >> end >> end >> object_list << new_obj >> end >> object_list >> end >> >> And the error: >> >> NameError: undefined local variable or method `att' for main:Object > > If att[1] is, say, :att, then "#{att[1]}" is "att" and you've got a > dangling att. The whole eval thing seems extremely fragile (which eval > things usually are). I imagine there's a more robust and probably > shorter way to do this, but I'm not sure what the data coming in and > out are supposed to be like. > > > David > I am almost positive that there is, given that I'm pretty much a noob at ruby. The whole thing is a class_eval too. The idea is to add this function to a class that has just been created based on a textfile. The function will receive a file that includes a yaml description of instances of the class, and the function then makes these instances and sends them back as a list. I think some fragility is okay, though I'd be keen on learning better ways to do this. Around the entire function is the_class.class_eval %{ the function... } I am confused about why it doesn't work though. /Johan