Dart_Сравнение введенного пароля с правильным -> “тип ‘String’ не является подтипом типа ‘bool’

Вопрос или проблема

“Dart_Сравнение введенного пароля с правильным -> “тип ‘String’ не является подтипом типа ‘bool'”

Я не могу понять, почему это не работает. Заранее спасибо.

import 'dart:io';

main() {
  AskPassword ("dog");
}  
AskPassword (correct){
  while (true){
    print("Введите пароль.");
    var password = stdin.readLineSync();
    if (password = correct){
      print("Спасибо!");
    } else {
    continue;
    }
  }
}

Я пробовал убрать “” и добавить str и тому подобное, но это не работает.

При проверке на равенство в Dart (и большинстве языков программирования) вы используете ==, когда хотите сравнить, представляют ли два объекта одно и то же значение.

Вы использовали =, что означает “присваивание”, и это используется для присвоения значения переменной.

Таким образом, правильный код будет:

import 'dart:io';

void main() {
  askPassword("dog");
}

void askPassword(String correct) {
  while (true) {
    print("Введите пароль.");
    var password = stdin.readLineSync();
    if (password == correct) {
      print("Спасибо!");
    } else {
      continue;
    }
  }
}

Я также сделал несколько других улучшений:

  • Если метод не должен ничего возвращать, вы должны указать void, так как в противном случае Dart предполагает, что вы хотите dynamic, что означает, что метод может возвращать любое значение и/или ничего.

  • Названия методов должны начинаться с строчной буквы, поскольку мы используем заглавные буквы только для типов в Dart. Существует много важных причин для соблюдения соглашений о наименовании в языках программирования, но самая важная из них – читаемость.

  • Параметры должны иметь типы, так как по умолчанию они, опять же, dynamic, что может означать любое значение. Но ваш код ожидает объект String, поэтому ваш метод должен это указать.

Ответ или решение

Ваша проблема заключается в том, что вы неправильно используете оператор сравнения в Dart. Вместо оператора == для сравнения значений вы использовали оператор присваивания =, что привело к ошибке. Давайте я объясню, как исправить ваш код и сделаю несколько дополнительных рекомендаций.

Вот исправленный код:

import 'dart:io';

void main() {
  askPassword("dog");
}

void askPassword(String correct) {
  while (true) {
    print("Введите пароль:");
    var password = stdin.readLineSync();
    if (password == correct) {
      print("Спасибо!");
      break; // Завершение цикла при правильном вводе пароля
    } else {
      print("Неверный пароль, попробуйте снова.");
    }
  }
}

Объяснение изменений:

  1. Использование оператора ==: Как уже было упомянуто, для сравнения двух значений в Dart используйте оператор ==, чтобы проверить, равны ли они. Оператор = предназначен для присваивания значений, чего в данном случае делать не следует.

  2. Добавление типа возвращаемого значения void: Если метод не возвращает ничего, всегда рекомендуется явно указывать его возвращаемый тип как void. Это повышает читаемость кода и делает его более понятным для других разработчиков.

  3. Использование стильных соглашений имен: В Dart принято, чтобы названия методов начинались с маленькой буквы (например, askPassword), так как с большой буквы начинаются только названия классов.

  4. Проверка на null: stdin.readLineSync() может вернуть null, если пользователь ничего не введёт. Вы можете добавить проверку на null, чтобы избежать потенциальных ошибок:
if (password != null && password == correct) {
  print("Спасибо!");
  break;
} else {
  print("Неверный пароль, попробуйте снова.");
}
  1. Выход из цикла: После успешного ввода пароля целесообразно завершить цикл, используя оператор break.

Убедитесь, что все ваши требования учтены, код теперь должен работать корректно. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...