[Japanese]
Version: 0.56.27 (2002.03.11) Author: Shin-ichiro HARA (sinara@blade.nagaokaut.ac.jp)
This is a library for Sets and Maps.
This is made as a part of the library "Algebra" originally.
Copy lib/*.rb to the directory where Ruby can load.
To create a Set object, use Set[]
, then you can use
the fundamental operations union, intersection and so on.
The criteria for identity of Set is the value of eql?.
The order of the elements is indefinite. Use Map[]
to get the map.
Exameple:
require "finite-set" include Algebra s = Set[3, 0, 1, 2, 3] p s #=> {0, 1, 2, 3} t = Set[2, 3, 4, 5] p s & t #=> {2, 3} p s | t #=> {5, 0, 1, 2, 3, 4} require "finite-map" m = Map[0 => 10, 1 => 11, 2 => 21, 3 => 31] p m.image(s) #=> {10, 31, 21, 11}
Set and Map hold the data as the Hash objects. So, the identity of objects are done not by == but by eql?. If you construct sets of which elements are the instances of user defined classes, you must re-define eql? and hash adequately. Especially,
if a.eql?(b) is true then a.hash == b.hash must be true.
The following is the example for the 2-dimensional vector.
Exameple: class Vector attr_accessor :x, :y def initialize(x, y) @x, @y = x, y end def eql?(other) @x == other.x and @y == other.y end alias == eql? def hash @x.hash ^ @y.hash end def inspect "[#{@x.inspect}, #{@y.inspect}]" end end v0, v1 = Vector.new(0, 1), Vector.new(1, 2) s = Set[v0, v1] p s.has? Vector.new(0, 1) #=> true
For built-in class, eql? and hash are already defined.
Even if all elements of set are of built-in class, when the conditions are chaned, you may not get the elements of the set. This is overcomed by use of Set#rehash.
Exameple: a = [0, 1] b = [1, 2] s = Set[a, b] a[0] = 10 p s #=> {[1, 2], [10, 1]} p s.has? [10, 1] #=> false s.rehash p s.has? [10, 1] #=> true