Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations IamaSherpa on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

strange thing w/ array.map

Status
Not open for further replies.

clemcrock

Programmer
Dec 17, 2006
63
US
Hello,

I'm writing a method that builds rss and atom feeds and I've noticed something strange when I try updating the content array by using a map.

I'm new to ruby and must confess that I don't know how array maps work so well.

I am formatting some of the rss content array by updating it's contents w/ a map like so:

Code:
@entities = Space.find :all

@new_entities = @entities.map do |entity|  
  open_closed = entity.complete? ? "[x] " : "[ ] "  
  entity.title = open_closed + entity.title 
  entity.title += (' due on ' + local_date_time(entity.due_on)) if entity.due_on
  entity.title += " (#{entity.status_title})"
end if @entities

then when I try to use the @new_entities array in the feed, I get an error

Code:
for entity in @new_entities  #-->>error!
  xml.item do
    xml.title(entity.title)
    xml.description(entity.description)
    xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
    xml.link("[URL unfurl="true"]http://www.recentrambles.com/pragmatic/view/"[/URL] + entity.id.to_s)
    xml.guid("[URL unfurl="true"]http://www.recentrambles.com/pragmatic/view/"[/URL] + entity.id.to_s)
  end
end

but, if I use the original @entities array it works perfectly
Code:
for entity in @entities   #-->>works!
  xml.item do
    xml.title(entity.title)
    xml.description(entity.description)
    xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
    xml.link("[URL unfurl="true"]http://www.recentrambles.com/pragmatic/view/"[/URL] + entity.id.to_s)
    xml.guid("[URL unfurl="true"]http://www.recentrambles.com/pragmatic/view/"[/URL] + entity.id.to_s)
  end
end


How, exactly, is that @entities array getting updated by the map?

Thanks for your help!
 
map returns an array of items returned by the block. I think (and I'm fairly new to Ruby here too) that the entity in your block is being set to a reference to the items in your @entities array, not a copy of the actual entities themselves. So you are updating the entries in the original array, not the ones you think you have copied.

Object seems to have a dup method that you might be able to use to copy the object inside the block, modify it, thenreturn it to map, but you'd have to experiment with that...

Steve

[small]"Every program can be reduced by one instruction, and every program has at least one bug. Therefore, any program can be reduced to one instruction which doesn't work." (Object::perlDesignPatterns)[/small]
 
thanks for getting back to me on this.

figured it out.

I didn't realize that by looping through the contents and making changes to entity.title, I was actually changing the array structure.

This is great stuff. All hail Ruby!
 
Can you post your code? I wouldn't mind seeing it...

Steve

[small]"Every program can be reduced by one instruction, and every program has at least one bug. Therefore, any program can be reduced to one instruction which doesn't work." (Object::perlDesignPatterns)[/small]
 
Yes, I too would like to see it. Could you also post the entity data structure. I was trying to emulate your problem and was not sure what entity was.
Marty
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top