Open straight-shoota opened 2 weeks ago
I think this example should be true instead of false?
slice == Slice[1, 2, 3] # => false
No, it's false. Slice[1, 2, 3]
allocates new memory for its contents. So it has a different pointer than slice
.
Doh š¤¦ It should be same?
instead of ==
.
Fixed.
IIUC this alone won't let you use Slice
s in a compare-by-identity Hash
yet, right?
Correct. Compare by identity is based on object id and falls back to ==
.
Slice
implements the equality operator==
as structural equality, i.e. two instances are considered equal if they have equivalent content. Two instances are considered equal if they have the same values:Slice[1, 2, 3] == Slice[1, 2, 3]
(or even just values expressing the same concept in different types:Slice[1.0, 2.0, 3.0] == Slice[1, 2, 3]
).There is no method for referential equality, i.e. if two instances pointing to the same memory.
Slice
is a struct type but it wraps a pointer, so it has semantics similar to a reference type. Referential equality would be similar to equality of the pointers, but checkingsize
as well -Slice
is a pointer plus size.Usually this is implemented as
#same?
and I think this would work well forSlice
.Related to referential equality and the implementation of
same?
is also#object_id
. For exampleSet
is a struct type but behaves like a reference because it's a wrapper of an reference type. It implements both#same?
and#object_id
(which just delegate to the wrapped reference). This doesn't work forSlice
because the wrapped pointer is not the only defining characteristic. Size is relevant as well. So I don't think#object_id
makes sense forSlice
because the pointer address is not unique. TwoSlice
instances can share the same pointer address, but with different sizes they would still be referentially unequal.