Я новичок в Дарте и просто изучаю основы.Проверка, если дополнительный параметр указан в Dart
The Dart-Homepage показывает следующее:
It turns out that Dart does indeed have a way to ask if an optional parameter was provided when the method was called. Just use the question mark parameter syntax.
Here is an example:
void alignDingleArm(num axis, [num rotations]) { if (?rotations) { // the parameter was really used } }
Так что я написал простой сценарий тестирования для обучения:
import 'dart:html';
void main() {
String showLine(String string, {String printBefore : "Line: ", String printAfter}){
// check, if parameter was set manually:
if(?printBefore){
// check, if parameter was set to null
if(printBefore == null){
printBefore = "";
}
}
String line = printBefore + string + printAfter;
output.appendText(line);
output.appendHtml("<br />\n");
return line;
}
showLine("Hallo Welt!",printBefore: null);
}
дротик-редактор уже отмечает вопросительный как Error:
Multiple markers at this line
- Unexpected token '?'
- Conditions must have a static type of
'bool'
При запуске сценария в Dartium JS-Console показывает следующее Ошибка:
Internal error: 'http://localhost:8081/main.dart': error: line 7 pos 8: unexpected token '?'
if(?printBefore){
^
Я знаю, что было бы достаточно, чтобы проверить, если printBefore имеет нулевое значение, но я хочу, чтобы выучить язык.
Кто-нибудь знает причину этой проблемы? Как проверить, установлен ли параметр вручную?
К сожалению, это не позволяет реализовать метод 'copyWith', когда он действителен для свойства, которое должно быть установлено в' null'. Один из них вынужден использовать оператор 'null'-coalescing, поэтому передача в' null' для этого свойства вместо этого игнорирует его и использует существующее значение, отличное от 'null'. –
Да, это неудачный побочный эффект. Если все значения действительны, вы не можете отличить фактическое значение «null» от пропущенного значения. В этом случае вам может понадобиться ввести класс частного маркера и использовать экземпляры этого аргумента по умолчанию, тогда вы знаете, что клиент не может передать экземпляр этого класса, поэтому значение по умолчанию отличается от любого значения клиента. Если ваши аргументы напечатаны, вам может понадобиться один класс для каждого типа (вы можете сделать 'class _XMarker extends _Marker реализует Foo' для значения по умолчанию параметра' Foo'). Если тип 'int', вы застряли :( – lrn