From: Alex Young Date: 2006-08-25T16:39:42+09:00 Subject: Re: Collections of structured-data objects: what approach? Graham Wideman wrote: > Folks: > > I'm new to Ruby, though not to programming in general. So I'm looking around > for some of the mechanisms I'm used to finding, and one of them is an > apparatus for Collections (as for example used in C++, OP, VB etc). > > I'm hoping that someone can point me in the right direction as to where this > functionality can be found, or failing that suggest the most advantageous > starting point to create it based on more primitive classes. You can get away with just using an Array for almost all of this. > Main features: > > 1. The contained objects are user-defined types having multiple fields (data > members). This in itself seems no problem for Ruby. > 2. Order/Retrieve by index. The collection should stay ordered by insertion > order and support retrieval by integer index. (Sorted collection is a > separate issue, of course.) > 3. Insert/Append/Remove/Delete. (List behavior) Allow appending (at end) or > inserting at arbitrary location, and removal or deletion of arbitrary > members. > 4. Find by key: (Dictionary behavior etc) Ability to retrieve member objects > by supplying a value to match against one of the object's fields. Often this > is simple a Name field on each object, which functions as a key, but at > other times one might want lookup based on some other field or fields. None of these are a problem for Array: a = [{:a => 1, :b => 2}, {:c => 4, :d => 5}] a[1] # => {:c=>4, :d=>5} a << {:e => 6, :f => 7} # => [{:b=>2, :a=>1}, {:c=>4, :d=>5}, {:e=>6, :f=>7}] a.select {|x| x[:c] == 4} # => [{:c=>4, :d=>5}] b = [1,2,3,4] b.insert(2,5) # => [1, 2, 5, 3, 4] > So far I've read plenty that seems related: arrays, hashes, Enumerable, and > several related chapters in PickAxe and Ruby for Rails. Although > "collections" are mentioned in many of these sources, I've not yet hit on a > treatment of the ruby way for the Collection basics described above (eg: R > on R's Collection chapter's description of "insert" is simply replacing the > Nth element of an array). If so, that's simply wrong. Array#insert(n, element) makes the inserted element the n'th and pushes everything after it along one. -- Alex