Hi --
Hi --
On Sat, 26 Apr 2008, Johan Eriksson wrote:
Chris Hulan 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.