Dart: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→String) |
|||
Zeile 7: | Zeile 7: | ||
= Statements = | = Statements = | ||
< | <source lang=dart>for (var ix in list) {} | ||
for (int ix = 0; ix < 10; ix++) {} | for (int ix = 0; ix < 10; ix++) {} | ||
while (doIt()){ } | while (doIt()){ } | ||
Zeile 19: | Zeile 19: | ||
} | } | ||
assert(str.isEmpty(), "String muss leer sein"); // nur im Debug aktiv. | assert(str.isEmpty(), "String muss leer sein"); // nur im Debug aktiv. | ||
</ | </source> | ||
== Exception == | == Exception == | ||
< | <source lang=dart> | ||
try { | try { | ||
breedMoreLlamas(); | breedMoreLlamas(); | ||
Zeile 39: | Zeile 39: | ||
MyException(this.message); | MyException(this.message); | ||
} | } | ||
</ | </source> | ||
= Class = | = Class = | ||
< | <source lang=dart>abstract class BaseLogger { | ||
int _errors = 0; | int _errors = 0; | ||
int _level; | int _level; | ||
Zeile 63: | Zeile 63: | ||
var logger = Logger('std.log'), logger2 = Logger.silentLogger('silent.log'); | var logger = Logger('std.log'), logger2 = Logger.silentLogger('silent.log'); | ||
const logger2 = BaseLogger.lastInstance(); | const logger2 = BaseLogger.lastInstance(); | ||
</ | </source> | ||
== Interface == | == Interface == | ||
* Jede Klasse kann Interface sein. Dann muss jede Methode überschrieben werden | * Jede Klasse kann Interface sein. Dann muss jede Methode überschrieben werden | ||
< | <source lang=dart> | ||
class D implements A, B, C { | class D implements A, B, C { | ||
@override | @override | ||
Zeile 73: | Zeile 73: | ||
} | } | ||
} | } | ||
</ | </source> | ||
== Generator == | == Generator == | ||
< | <source lang=dart>Iterable<int> naturalsTo(int n) sync* { | ||
int k = 0; | int k = 0; | ||
while (k < n) yield k++; | while (k < n) yield k++; | ||
} | } | ||
</ | </source> | ||
* ... und mit Rekursion: | * ... und mit Rekursion: | ||
< | <source lang=dart>Iterable<int> naturalsDownFrom(int n) sync* { | ||
if (n > 0) { | if (n > 0) { | ||
yield n; | yield n; | ||
Zeile 88: | Zeile 88: | ||
} | } | ||
} | } | ||
</ | </source> | ||
= Map = | = Map = | ||
< | <source lang=dart>final map = <String, int>{ 'John': 1, 'Eve': 2 }; | ||
final knowsEve = map.containsKey('Eve') && map.containsValue(2); | final knowsEve = map.containsKey('Eve') && map.containsValue(2); | ||
map.remove('John'); | map.remove('John'); | ||
Zeile 98: | Zeile 98: | ||
map.forEach((k, v) { print('{ key: $k, value: $v }'); }); | map.forEach((k, v) { print('{ key: $k, value: $v }'); }); | ||
map.entries.forEach((e) { print('{ key: ${e.key}, value: ${e.value} }'); }); | map.entries.forEach((e) { print('{ key: ${e.key}, value: ${e.value} }'); }); | ||
</ | </source> | ||
= List = | = List = | ||
* Indizes: start: inklusiv end: exklusiv | * Indizes: start: inklusiv end: exklusiv | ||
< | <source lang=dart>final names = <String>['adam', 'bob', 'charly', 'eve']; | ||
names.add('fred'); | names.add('fred'); | ||
ix = names.indexOf('bob'); ix2 = names.indexWhere((item) => item.startsWith('b'), start); | ix = names.indexOf('bob'); ix2 = names.indexWhere((item) => item.startsWith('b'), start); | ||
Zeile 118: | Zeile 118: | ||
// fold(), reduce(), shuffle(), removeWhere(), | // fold(), reduce(), shuffle(), removeWhere(), | ||
// foreach(), join(), contains() | // foreach(), join(), contains() | ||
</ | </source> | ||
= DateTime = | = DateTime = | ||
< | <source lang=dart>var now = new DateTime.now(); | ||
var moonLanding = DateTime.parse("1969-07-20 20:18:04Z"); | var moonLanding = DateTime.parse("1969-07-20 20:18:04Z"); | ||
var sixtyDaysFromNow = now.add(new Duration(days: 60)); | var sixtyDaysFromNow = now.add(new Duration(days: 60)); | ||
Zeile 133: | Zeile 133: | ||
var formatter = new DateFormat('yyyy.MM.dd HH:mm:ss dayOfWeek: E'); | var formatter = new DateFormat('yyyy.MM.dd HH:mm:ss dayOfWeek: E'); | ||
String formatted = formatter.format(now); | String formatted = formatter.format(now); | ||
</ | </source> | ||
= RegExpr = | = RegExpr = | ||
< | <source lang=dart>final regExpr = RegExp(r'(\w+)\s*=\s*(\d+)'); | ||
final matcher = reDisks.firstMatch(line); | final matcher = reDisks.firstMatch(line); | ||
if (matcher != null){ | if (matcher != null){ | ||
vars[matcher.group(1)] = int.parse(matcher.group(2)); | vars[matcher.group(1)] = int.parse(matcher.group(2)); | ||
} | } | ||
</ | </source> | ||
= String = | = String = | ||
<source lang=dart> | |||
const limit = 3; | |||
var interpreted = "Limit: $limit Time: ${time()}"; | |||
</source> | |||
== Konversion == | == Konversion == | ||
< | <source lang=dart>final count = int.parse("123"); | ||
</ | </source> | ||
== Formatierung == | == Formatierung == | ||
< | <source lang=dart>import 'package:sprintf/sprintf.dart'; | ||
sprintf("%02d %s", [1, "Hi"]); | sprintf("%02d %s", [1, "Hi"]); | ||
print("${new DateTime.now().toString()}: $message\n"); | print("${new DateTime.now().toString()}: $message\n"); | ||
</ | </source> | ||
= Besonderheiten = | = Besonderheiten = | ||
* entweder optionale Positionsparameter oder optionale Namensparameter, nicht beide. | * entweder optionale Positionsparameter oder optionale Namensparameter, nicht beide. | ||
< | <source lang=dart>String substr(String str, int pos, [int length, bool uppercase]){ ... } | ||
String substr2(String str, int pos, {int length, bool uppercase, Logger logger}){ ... } | |||
x = substr('Hi world', 3, 2); | x = substr('Hi world', 3, 2); | ||
y = substr2('Hi world', 3, length:2, logger:logger); | 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); | 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 | |||
</source> | |||
== Reflection, Runtime-Info == | == Reflection, Runtime-Info == | ||
< | <source lang=dart>if (a.runtimeType == int || a.runtimeType == String)... | ||
</ | </source> |
Version vom 22. September 2020, 10:01 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 now = new DateTime.now();
var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
var sixtyDaysFromNow = now.add(new Duration(days: 60));
final diffDays = sixtyDaysFromNow.difference(moonLanding).inDays;
var dateUtc = new DateTime.utc(1944, 6, 6);
var local = dateUts.toLocal();
var isBefore = now.before(sixtyDaysFromNow);
var linuxTime = now.millisecondsSinceEpoch ~/ 1000;
var formatter = new DateFormat('yyyy.MM.dd HH:mm:ss dayOfWeek: E');
String formatted = formatter.format(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
const limit = 3;
var interpreted = "Limit: $limit Time: ${time()}";
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]){ ... }
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
if (a.runtimeType == int || a.runtimeType == String)...