Скажімо, у нас є наступний клас Python (проблема в Java існує точно так само, як equals
і hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
де degrees
температура в Кельвіні як поплавок. Тепер я хотів би здійснити перевірку рівності і хешування для Temperature
таким чином , що
- порівнює поплавці до epsilon різниці замість прямого тестування рівності,
- і вшановує договір, який
a == b
передбачаєhash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
Документація Python трохи розповідає про хеш-номери, щоб забезпечити це, hash(2) == hash(2.0)
але це не зовсім та сама проблема.
Я навіть на правильному шляху? І якщо так, то який стандартний спосіб реалізувати хешинг у цій ситуації?
Оновлення : Тепер я розумію, що цей тип тестування рівності для плавців виключає транзитивність ==
та equals
. Але як це відбувається разом із "загальновідомими", які плавають, не слід порівнювати безпосередньо? Якщо ви реалізуєте оператор рівності, порівнюючи поплавці, інструменти статичного аналізу подаватимуть скарги. Чи правильно вони це роблять?
kelvin
?