Comparing objects in Racket
Equality methods
By implementing a method for equality equal-to?
and two extraction methods equal-hash-code-of
and equal-secondary-hash-code-of
we can define our own object comparison rules.
For more info see Object Equality and Hashing.
Consider the following example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(define integer% (class* object% (equal<%>) (super-new) (init-field [value 0]) (define/public (equal-to? other-object recur) (= value (get-field value other-object))) (define/public (equal-hash-code-of hash-code) (hash-code value)) (define/public (equal-secondary-hash-code-of hash-code) (hash-code value)))) |
If we create a new integer%
object we can notice that it is not transparent (we can not inspect values of any of it’s fields).
1 2 |
(new integer%) ;; => (object:integer% ...) |
But if we compare two fresh integer%
objects they will be equal.
Transparent class
A transparent cvlass is a class with the inspect
expression valuye se to #false
.
From Racket documentation Creating Classes:
Just as for structure types, an inspector controls access to the class’s fields, including private fields, and also affects comparisons using equal?.
Consider the following example:
If we create a new integer%
object we can see it’s field values.
1 2 |
(new integer%) ;; => (object:integer% 0) |
And if we compare two fresh integer%
objects they will be equal.