Forum: Ruby Comparing Arrays

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7863582496e914f1ffce56f98d468f72?d=identicon&s=25 Nathan Olberding (nko)
on 2006-04-05 18:44
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?
81d609425e306219d54d793a0ad98bce?d=identicon&s=25 Matthew Moss (Guest)
on 2006-04-05 18:58
(Received via mailing list)
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.

Might you want this:

originalList = originalList - deleteList
4299e35bacef054df40583da2d51edea?d=identicon&s=25 James Gray (bbazzarrakk)
on 2006-04-05 18:58
(Received via mailing list)
On Apr 5, 2006, at 11:44 AM, Nathan Olberding wrote:

> I have two arrays: originalList and deleteList.

Just FYI, the Ruby naming convention is to make those original_list
and delete_list.

> I'm trying to iterate
> through original list and remove each item if it appears in the
> deleteList. Simple enough.

Sure is, try:

   original_list - delete_list

;)

James Edward Gray II
52a177e9dbd3e614825aabc4e45f8cd6?d=identicon&s=25 Mark Volkmann (Guest)
on 2006-04-05 19:29
(Received via mailing list)
On 4/5/06, Nathan Olberding <nathan.olberding@gmail.com> wrote:
>
> 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.

obj_to_delete = whatever
my_array.delete_if { |obj| obj.eql?(obj_to_delete) }
7863582496e914f1ffce56f98d468f72?d=identicon&s=25 Nathan Olberding (nko)
on 2006-04-05 22:40
Mark Volkmann wrote:

> 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.
>
> obj_to_delete = whatever
> my_array.delete_if { |obj| obj.eql?(obj_to_delete) }

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.
4299e35bacef054df40583da2d51edea?d=identicon&s=25 James Gray (bbazzarrakk)
on 2006-04-05 22:51
(Received via mailing list)
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.

vars_and_methods_like_this

ClassesAndModulesLikeThis

CONSTANTS_GENERALLY_LIKE_THIS  # some people use the class style here
too

nothingLikeThisJavaStyle  # ;)

James Edward Gray II
7863582496e914f1ffce56f98d468f72?d=identicon&s=25 Nathan Olberding (nko)
on 2006-04-05 23:08
James Gray wrote:
> vars_and_methods_like_this
>
> ClassesAndModulesLikeThis
>
> CONSTANTS_GENERALLY_LIKE_THIS  # some people use the class style here
> too
>
> nothingLikeThisJavaStyle  # ;)
>
> James Edward Gray II

Seems you're right! I was looking at documentation for 1.6. Everything
I'm finding for 1.8 is_this_way.

Wonderful. I'll try to remember that for my *next* project!
This topic is locked and can not be replied to.