это по умолчанию в компиляторе Dart? - PullRequest
0 голосов
/ 22 октября 2019

Я трачу несколько часов, чтобы найти ошибку в дартс-программе.
Самое простое, я нашел что-то вроде:

class User{  
 String name;  
 User(String name){  
  name = "user +$name";  
}
}

Это должно было быть _name для внутреннегосвойство, но разработчик забывает это правило.
Код дает нулевой результат:

User u1 = new User("U1");  
  print(u1.name);  
> null

Мой вопрос:
Мне кажется странным, что компилятор позволяет повторно использовать тот же var name в параметрах вызова и внутри кода без каких-либо предупреждений.
Я думаю, что если какой-то параметр похож на * User (String name) *, то дальнейшее использование name должно быть прочитано-только.

Это слабость языка?
Вы видели такой же PB на других языках?

1 Ответ

1 голос
/ 22 октября 2019

Я могу видеть, откуда вы, но это те же правила области видимости, что и в Java (и, соответственно, также в C #?), И нормальное поведение для параметров для методов и конструкторов.

Я думаю, что переназначить параметр с помощьюдругое значение - плохое поведение, и вы можете заставить анализатор обнаружить это, добавив следующее правило линтера к analysis_options.yaml:

linter:
  rules:
    parameter_assignments

Правило описано здесь: http://dart -lang.github.io / linter / lints / parameter_assignments.html

Но я вижу, что это правило не используется для конструкторов, которые являются вашим случаем, и я думаю, что это ошибка для линтера или случай, когдадолжно быть другое правило, чтобы обнаружить назначения параметров для конструкторов. Поэтому я бы предложил вам создать здесь проблему: https://github.com/dart-lang/linter/issues

Поведение только для чтения для параметров (как для методов, так и для конструкторов) может быть достигнуто с помощью final для каждого параметра как:

  User(final String name) {
    name = 'user +$name'; // error: 'name' a final variable can only be set once
  }

Но это не совсем практично в том смысле, что вы хотите предотвратить несчастные случаи, когда разработчик забудет что-то сделать.

И просто для записи, вы можете присвоить значение name в User класс, выполнив это (если вы все еще хотите, чтобы параметр и переменная класса имели одно и то же имя):

class User {
  String name;

  User(String name) {
    this.name = 'user +$name';
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...