I have two arrays: originalList and deleteList. I'm trying to iterate
through original list and remove each item if it appears in the
deleteList. Simple enough. Here's my snippet for doing this:
originalList.each do |item|
if deleteList.include?(item)
puts "Deleting " + item
originalList.delete(item)
end
end
Unfortunately, this code doesn't seem to be doing what I think it
should. It seems to skip some items in originalList. I can provide
examples upon request. Is there anything wrong with my algorithm?
I would think that trying to remove items from the list you are
enumerating is generally a bad thing... I don't know enough about Ruby
internals to know whether that applies to Ruby, but I generally avoid
it.
I got bit by something similar this past weekend. It turns out that
Array#delete deletes based on == comparisons (generally means two
objects are from the same class and have the same instance variable
values), not eql? comparisons (means same object) as I had guessed.
That can be a significant difference. For one thing it allows the
delete method to delete more than one object from the array. If you
want to delete a specific object based on its identity, as far as I
know you need to do it like this.
On 4/5/06, Nathan Olberding <nathan.olberding@gmail.com> wrote:
I have two arrays: originalList and deleteList. I'm trying to iterate
through original list and remove each item if it appears in the
deleteList. Simple enough. Here's my snippet for doing this:
originalList.each do |item|
if deleteList.include?(item)
puts "Deleting " + item
originalList.delete(item)
end
end
Unfortunately, this code doesn't seem to be doing what I think it
should. It seems to skip some items in originalList. I can provide
examples upon request. Is there anything wrong with my algorithm?
I got bit by something similar this past weekend. It turns out that
Array#delete deletes based on == comparisons (generally means two
objects are from the same class and have the same instance variable
values), not eql? comparisons (means same object) as I had guessed.
That can be a significant difference. For one thing it allows the
delete method to delete more than one object from the array. If you
want to delete a specific object based on its identity, as far as I
know you need to do it like this.
That sounds like something not many people would assume, and therefor
maybe something that might be reviewed before 2.0... but anyways!
The list1 - list2 way of doing this worked wonders. Funny, I used this
two weeks ago, the last time I hacked on this script, and had completely
forgotten about it. Many thanks to everyone!
As an aside, is_this the ruby naming convention, orThis? All the
references I've seen on the web useThis. Either is fine, I'm just
wondering now that it's been brought up.
CONSTANTS_GENERALLY_LIKE_THIS # some people use the class style here too
nothingLikeThisJavaStyle #
James Edward Gray II
···
On Apr 5, 2006, at 3:40 PM, Nathan Olberding wrote:
As an aside, is_this the ruby naming convention, orThis? All the
references I've seen on the web useThis. Either is fine, I'm just
wondering now that it's been brought up.