Вопрос или проблема
“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("Неверный пароль, попробуйте снова.");
}
}
}
Объяснение изменений:
-
Использование оператора
==
: Как уже было упомянуто, для сравнения двух значений в Dart используйте оператор==
, чтобы проверить, равны ли они. Оператор=
предназначен для присваивания значений, чего в данном случае делать не следует. -
Добавление типа возвращаемого значения
void
: Если метод не возвращает ничего, всегда рекомендуется явно указывать его возвращаемый тип какvoid
. Это повышает читаемость кода и делает его более понятным для других разработчиков. -
Использование стильных соглашений имен: В Dart принято, чтобы названия методов начинались с маленькой буквы (например,
askPassword
), так как с большой буквы начинаются только названия классов. - Проверка на
null
:stdin.readLineSync()
может вернутьnull
, если пользователь ничего не введёт. Вы можете добавить проверку наnull
, чтобы избежать потенциальных ошибок:
if (password != null && password == correct) {
print("Спасибо!");
break;
} else {
print("Неверный пароль, попробуйте снова.");
}
- Выход из цикла: После успешного ввода пароля целесообразно завершить цикл, используя оператор
break
.
Убедитесь, что все ваши требования учтены, код теперь должен работать корректно. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!