Zouplaz
February 26, 2008, 3:27pm
1
Hello, sorry if this question is stupid but I can’t find a solution
after several readings about Arrays
Array ‘a’ contains several objets (ruby classes instances), each
instance have an id property
I need a clean solution to return true if array ‘a’ contains an instance
with id foo without iterating the whole array.
Example
def add_user(user)
unless users.include?(user.id)
users << user
end
end
users.include? statement is wrong because we compare id’s with objects.
Which is the right way to do it ?
Thanks
Zouplaz
February 26, 2008, 3:37pm
2
On Tue, Feb 26, 2008 at 3:20 PM, Zouplaz [email protected] wrote:
Example
def add_user(user)
unless users.include?(user.id)
unless users.any? {|u| user.id == u.id }
Zouplaz
February 26, 2008, 3:42pm
3
On Tue, Feb 26, 2008 at 9:36 AM, Jano S. [email protected]
wrote:
with id foo without iterating the whole array.
Example
def add_user(user)
unless users.include?(user.id)
unless users.any? {|u| user.id == u.id }
users << user
end
end
If you can’t do this
def add_user(user)
unless users.include?(user) # just check the user instead of the id
users << user
end
end
then I’d also recommend Jano’s solution.
Regards,
Craig
Zouplaz
February 26, 2008, 3:47pm
4
2008/2/26, Jano S. [email protected] :
Example
def add_user(user)
unless users.include?(user.id)
unless users.any? {|u| user.id == u.id }
users << user
end
end
For a more efficient solution use a Hash:
def add_user(user)
@users [user.id] ||= user
end
def users
@users.values
end
Kind regards
robert
Zouplaz
February 26, 2008, 4:03pm
5
On 2/26/08, Christopher S. [email protected] wrote:
end
Christopher
Additionally, if a unique user always has the same id (for instance,
they’re defined in a database and the id is the primary key), then you
can override #== in your class to compare ids to determine equality.
Then you can just call #include ? with the user directly:
def add_user(user)
unless users.include?(user)
users << user
end
end
This is almost definitely the most efficient solution, but it does
require you to modify your class.
Best,
Christopher
Zouplaz
February 26, 2008, 11:32pm
6
le 26/02/2008 15:36, Jano S. nous a dit:
def add_user(user)
unless users.include?(user.id)
unless users.any? {|u| user.id == u.id }
users << user
end
end
Fine ! This is was I was looking for.
Thanks to people who answered…
Zouplaz
February 26, 2008, 3:49pm
7
On 2/26/08, Zouplaz [email protected] wrote:
Example
def add_user(user)
unless users.include?(user.id)
users << user
end
end
users.include? statement is wrong because we compare id’s with objects.
Which is the right way to do it ?
Read up on the Enumerable module.
module Enumerable - RDoc Documentation .
You have a couple of options. The simplest code-wise is to use find:
def add_user(user)
unless users.find { |u| u.id == user.id }
users << user
end
end
Potentially marginally more efficient is #map and then calling
#include ? on the result
def add_user(user)
unless users.map { |u| u.id }.include?(user.id)
users << user
end
end
Christopher