Компонент дротика

Каков наилучший способ сравнить Струны в Дарте? Класс String не содержит метод equals. Рекомендуется ли ==?

Например:

String rubi = 'good';
String ore = 'good';

rubi == ore;

Ответ 1

Да, == - это способ проверить, являются ли две строки равными (содержат исключительно одну и ту же последовательность символов). Последняя строка вашего кода оценивается как true.

Ответ 2

Строки - это неизменные объекты, что означает, что вы можете их создать, но вы не можете их изменить. Вы можете, конечно, построить новую строку из других строк, но после ее создания содержимое строки будет исправлено.

Это оптимизация, поскольку две строки с одинаковыми символами в одном порядке могут быть одним и тем же объектом.

String rubi = 'good';
String ore = 'good';

print(rubi == ore); // true, contain the same characters
print(identical(rubi, ore)); // true, are the same object in memory

Ответ 3

В отличие от Java, Dart позволяет переопределять такие операторы, как ==. Таким образом, вы можете определить свой собственный тест для этого оператора, чтобы проверить равенство. Вы также можете использовать функцию indentical, чтобы проверить, соответствуют ли две ссылки одному и тому же объекту (эквивалент == для объектов в Java).

Для String s это немного особенное. В зависимости от того, как вы создаете String, вы можете иметь разные результаты с DartVM:

main() {
  final s = "test";

  printTests(s, "test");
  // displays '==' => true    'identical' => true

  printTests(s, "$s");
  // displays '==' => true    'identical' => false

  printTests(s, new String.fromCharCodes(s.codeUnits));
  // displays '==' => true    'identical' => false
}

printTests(String s1, String s2) {
  print("'==' => ${s1 == s2}    'identical' => ${identical(s1, s2)}");
}

Поскольку вы можете видеть, что identical возвращает true только для первого случая, а == всегда true. Но это не всегда так. Если вы запустите этот код в javascript после компиляции dart2js, то identical и == всегда возвращают true.

В большинстве случаев вы хотите сравнить значения String, а не их ссылки, поэтому вы должны использовать ==.