==
сравнивает значения. is
сравнивает ссылки. Ваша большая ошибка - использование функции reverse
.
http://dpldocs.info/experimental-docs/std.algorithm.mutation.reverse.html
Инвертирует r на месте.
Акцент мой. Это означает, что он изменяет содержимое оригинала.
Я подозреваю, что вы также неверно проверяете адрес памяти. Если вы используете &arr
, вы сравниваете адрес локальных переменных, а не содержимое массива. Это не изменится, потому что это одна и та же локальная переменная, вы просто привязываетесь к другому массиву. Отметьте .ptr
вместо &
, и вы увидите, что он меняется - функция .array
всегда выделяет для него новый массив.
Итак == пройдено, потому что обратное изменило левую часть на то жевремя! Это было не потому, что [1,2,3] == [3,2,1], а потому, что после вызова reverse, [1,2,3] сам был изменен на [3,2,1], который== [3,2,1]!.
Теперь о том, что на самом деле делают эти операторы: ==
проверяет некоторое абстрактное качество равенства. Это зависит от типа: оно может быть переопределено функциями-членами (именно поэтому вызов его для классов null
проблематично) и часто выполняет сравнение между членами (например, элементы массива или элементы структуры).
is
, с другой стороны, делает что-то намного проще: это битовое сравнение переменной напрямую, что ближе к абстрактному представлению о тождестве, но не совсем (как проходы int a = 3; int b = 3; assert(a is b);
, потому что оба - 3, ноэто та же самая идентичность? нечеткая причина типа значения.)
is
никогда не будет вызывать пользовательскую функцию и никогда не будет переходить к ссылкам на элементы, она просто сравнивает значения битов.
(что интересно, float.nan is float.nan
также возвращает true, тогда как == не будет, опять же только потому, что он сравнивает битовые значения. Но не все nans имеют одинаковое битовое значение, поэтому он не заменяет isNaN в математическом модуле!)