Perl:
sub is_palindrome {
my $s = lc shift; # normalize case
$s =~ s/\W//g; # strip non-word characters
return $s eq reverse $s;
}
Я считаю, что стандартом является то, что для большинства типов .Equals проверяет сходство объектов, а оператор ==
проверяет ссылочное равенство.
Я считаю, что наилучшей практикой является то, что для неизменяемые типы, оператор ==
должен проверять сходство, как и .Equals
. А если вы хотите узнать, действительно ли это один и тот же объект, используйте .ReferenceEquals
. См. Пример этого в классе C # String
.
Я не думаю, что для неизменяемых типов есть что-то плохое в том, что ==
перегружен для поддержки равенства значений. Однако я не думаю, что переопределил бы ==
без переопределения Equals
, чтобы иметь ту же семантику. Если вы переопределяете ==
и по какой-то причине вам необходимо проверить равенство ссылок, вы можете использовать Object.ReferenceEquals (a, b)
.
Определенно пахнет. При перегрузке ==
вы должны убедиться, что оба Equals ()
и GetHashCode ()
также согласованы. См. рекомендации MSDN .
И единственная причина, по которой это кажется нормальным, заключается в том, что вы описываете свой тип как неизменяемый.
Существует большая разница между перегрузкой ==
и переопределением Equals.
Когда у вас есть выражение
if (x == y) {
Метод решение, которое будет использоваться для сравнения переменных x и y, будет принято во время компиляции . Это перегрузка оператора. Тип, используемый при объявлении x и y, используется для определения метода, используемого для их сравнения. Фактический тип в пределах x и y (т. Е. Подкласс или реализация интерфейса) не имеет значения. Рассмотрим следующее.
object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
if (x == y) { // evaluates to FALSE
и следующее
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
if (x == y) { // evaluates to TRUE
Это демонстрирует, что тип, используемый для объявления переменных x и y, используется для определения того, какой метод используется для вычисления ==.
Для сравнения, Equals определяется в время выполнения на основе фактического типа в переменной x. Equals - это виртуальный метод объекта, который могут использовать другие типы, и сделать, переопределить. Поэтому оба следующих примера имеют значение true.
object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
if (x.Equals(y)) { // evaluates to TRUE
и следующий
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
if (x.Equals(y)) { // also evaluates to TRUE