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:
(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).
(new integer%)
;; => (object:integer% ...)
But if we compare two fresh integer%
objects they will be equal.
(equal? (new integer%) (new integer%))
;; => #true
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:
(define integer%
(class object%
(super-new)
(inspect #false)
(init-field [value 0])))
If we create a new integer%
object we can see it’s field values.
(new integer%)
;; => (object:integer% 0)
And if we compare two fresh integer%
objects they will be equal.
(equal? (new integer%) (new integer%))
;; => #true