Dart: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
K (→List) |
(→Class) |
||
Zeile 45: | Zeile 45: | ||
int _errors = 0; | int _errors = 0; | ||
int _level; | int _level; | ||
static BaseLogger _lastInstance; | |||
bool get isSilent => _level == 0; // getter | bool get isSilent => _level == 0; // getter | ||
set isSilent(bool value) => _level = value ? 0 : 1; // setter | set isSilent(bool value) => _level = value ? 0 : 1; // setter | ||
Zeile 52: | Zeile 53: | ||
void log(string message); | void log(string message); | ||
void error(string message){ _errors++; log('+++ ' + message); } | void error(string message){ _errors++; log('+++ ' + message); } | ||
static BaseLogger lastInstance() { return _lastInstance; } | |||
} | } | ||
class Logger extends BaseLogger { | class Logger extends BaseLogger { | ||
Zeile 60: | Zeile 62: | ||
... | ... | ||
var logger = Logger('std.log'), logger2 = Logger.silentLogger('silent.log'); | var logger = Logger('std.log'), logger2 = Logger.silentLogger('silent.log'); | ||
const logger2 = BaseLogger.lastInstance(); | |||
</pre> | </pre> | ||
== Interface == | == Interface == |
Version vom 22. April 2020, 08:25 Uhr
Links
Statements
for (var ix in list) {} for (int ix = 0; ix < 10; ix++) {} while (doIt()){ } do { } while(test()); switch(x) { case '0': case 'A': y=3; break; case 'B': b=true; continue on_label_c; // Implementierung von "fall through" on_label_c: case 'C': y=5; break; default: break; } assert(str.isEmpty(), "String muss leer sein"); // nur im Debug aktiv.
Exception
try { breedMoreLlamas(); } on OutOfLlamasException { buyMoreLlamas(); } on Exception catch (e) { print('Unknown exception: $e'); // Anything else that is an exception } catch (e, stacktrace) { print('Something really unknown: $e $stacktrace'); // No specified type, handles all rethrow; // throw the same exception again } finally { cleanUp(); } throw ArgumentError('not an int'); class MyException implements Exception{ String message; MyException(this.message); }
Class
abstract class BaseLogger { int _errors = 0; int _level; static BaseLogger _lastInstance; bool get isSilent => _level == 0; // getter set isSilent(bool value) => _level = value ? 0 : 1; // setter BaseLogger(this._level); // constructor BaseLogger.silent() : this(0); // named constructor, "redirected constructor" // abstract function: void log(string message); void error(string message){ _errors++; log('+++ ' + message); } static BaseLogger lastInstance() { return _lastInstance; } } class Logger extends BaseLogger { String _filename; Logger(this._filename) : super(1); Logger.silentLogger(this._filename) : super.silent(0); // named constructor } ... var logger = Logger('std.log'), logger2 = Logger.silentLogger('silent.log'); const logger2 = BaseLogger.lastInstance();
Interface
- Jede Klasse kann Interface sein. Dann muss jede Methode überschrieben werden
class D implements A, B, C { @override void doIt(){ // ... } }
Generator
Iterable<int> naturalsTo(int n) sync* { int k = 0; while (k < n) yield k++; }
- ... und mit Rekursion:
Iterable<int> naturalsDownFrom(int n) sync* { if (n > 0) { yield n; yield* naturalsDownFrom(n - 1); } }
Map
final map = <String, int>{ 'John': 1, 'Eve': 2 }; final knowsEve = map.containsKey('Eve') && map.containsValue(2); map.remove('John'); map.removeWhere((k, v) => k.startsWith('J')); final combinedMap1 = {...map1, ...map2}; map.forEach((k, v) { print('{ key: $k, value: $v }'); }); map.entries.forEach((e) { print('{ key: ${e.key}, value: ${e.value} }'); });
List
- Indizes: start: inklusiv end: exklusiv
final names = <String>['adam', 'bob', 'charly', 'eve']; names.add('fred'); ix = names.indexOf('bob'); ix2 = names.indexWhere((item) => item.startsWith('b'), start); names.remove('bob'); names.removeAt(2); names2 = names.getRange(2, 3); name3 = names.sublist(ixStart, ixEnd); print(names.first + ' ' + names.last); names.firstWhere( (item) => item.length == 3); names.replaceRange(1,3, ['john', 'judith']); final first2Elements = names.take(2); final allButFirst2Elements = names.skip(2); names.followedBy(name2); // liefert names und die Iterables name2 names.any((item) => item.length < 3); // irgend ein Element mit der Bedingung names.every((item) => item.length < 3); // alle Elemente mit der Bedingung // fold(), reduce(), shuffle(), removeWhere(), // foreach(), join(), contains()
DateTime
var date = new DateTime.now();
RegExpr
final regExpr = RegExp(r'(\w+)\s*=\s*(\d+)'); final matcher = reDisks.firstMatch(line); if (matcher != null){ vars[matcher.group(1)] = int.parse(matcher.group(2)); }
String
Konversion
final count = int.parse("123");
Formatierung
import 'package:sprintf/sprintf.dart'; sprintf("%02d %s", [1, "Hi"]); print("${new DateTime.now().toString()}: $message\n");
Besonderheiten
- entweder optionale Positionsparameter oder optionale Namensparameter, nicht beide.
String substr(String str, int pos, [int length, bool uppercase]){ ... } <pre>String substr2(String str, int pos, {int length, bool uppercase, Logger logger}){ ... } x = substr('Hi world', 3, 2); y = substr2('Hi world', 3, length:2, logger:logger);
- ..-Operator: Mehrfachzugriff auf voriges Objekt:
var person = Person()..name='Joe'..id=25; var p = Point(10, -12)..setColor(green)..setWeight(1.22);
- x ??= 5; // Zuweisung nur, wenn x==null
- x ~/ 5 // Ganzzahlige Division
- logger?.log() // Aufruf von log nur, wenn logger!=null
Reflection, Runtime-Info
a.runtimeType