Dart语法重新整理
内容纲要
很多年前简单总结了Dart的一些特点,都是基于当时的一些使用情况,从新梳理下。
Dart特点
- 在Dart中,一切都是对象,所有的对象都是继承Object,也就是所有能够使用变量引用的都是对象,每个对象都是一个了类的实例。在Dart中甚至数字、方法和null都是对象。
没有赋初值的变量都会有默认值null
标识符可以以字母或者_下划线开头,后面可以是其他字符和数字的组合。
Dart支持顶级方法,如main方法,同时还支持在类中定义函数(静态函数和实例函数),还可以在方法中定义方法,Dart支持顶层变量,也支持类变量或对象变量。
Dart没有public、protected、private关键字。如果某个变量以下划线_开头,代表这个变量是在库中是私有的。
Dart中的类和接口都是统一的,类即是接口,你可以继承一个类,也可以实现一个类,自然也包含了良好的面向对象和并发编程的支持。
final的值只能被设定一次。const是一个编译时的常量,可以通过const来创建常量值,var n = const[],这里n还是一个变量,只是被赋值了一个常量值,它还是可以符其他值。实例变量可以是final,但不能是const。
Dart是强类型语言,但可以用var或者dynamic来声明一个变量,Dart会自动推断其数据类型,dynamic类似C#
使用静态类型可以更清晰表面你的意图,并且可以让静态分析工具来分析你的代码。
Dart在运行之前会先解析你的代码。你可以通过使用类型或者编译时常量来帮助Dart去捕获异常以及让代码运行的更高效。
Dart工具可以指出两种问题:警告和错误。警告只是说你的代码可能有问题,但是并不会阻止你的代码执行。错误可以是编译时错误也可以是运行时错误。遇到编译时错时,代码将无法执行;运行时错误将会在运行代码的时候导致一个异常。
Dart语法
保留字
| const | null | class | new | this | |
| as | default | final | continue | throw | |
| assert | deferred | finally | operator | true | |
| async | do | for | part | try | |
| async* | dynamic | get | rethrow | typedef | |
| await | else | if | return | var | |
| break | enum | implements | set | void | |
| case | export | import | static | while | |
| catch | external | in | super | with | |
| false | extends | is | switch | yield | |
| abstract | factory | library | sync* | yield* |
程序入口
void main(){
var number = 6.76;//动态类型声明 隐式转换类型
trace(number);
}
trace(num Number){//指定类型
print('The number is $Number');//模版字符串
}
语法核心
var lalala;
var wahaha = 1;
print(lalala);//null
print(wahaha);//1
//数值类型
int a = 2;//整型
double aa = 3.1415;//浮点型
print(a);//指定类型
b ??= a;
//根据转换标准
double aaa = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
print(aaa);//0.9999999999999999
print(aaa.toStringAsFixed(0));//1
print(aaa.toStringAsFixed(2));//1.00
//运算符:+、-、*、/、~/、%
//属性:isNaN、isEven、isOdd
//方法:abs()、round()、floor()、ceil()、toInt()、toDouble()等
int num7 = 3;
double num10 = 10.1;
print(num7 / num10);//0.297029702970297
print(num7 ~/ num10);//0
//字符串
String str1 = "'啦啦啦'";//'啦啦啦'
String str2 = '"娃哈哈"';//"娃哈哈"
//常量
const b = "b";声明时赋值一次
final c = "c";//运行时赋值一次
const String d = "词法常量";
final String e;
e = "运行时常量";
print(b);//b
print(c);//c
print(d);//词法常量
print(e);//运行时常量
//bool布尔
bool b = true;
if(b){
print("true");
}else{
print("false");
}
print(b ? "三元true" : "三元false");
//数组List
List list = [0,1,2];
//可new
List list1 = new List();
List list2 = const[0,1,2];
//�指定单类型
List list3 = new List<String>();
List list4 = new List(5);
List list5 = new List.from([0,1,2,3]);
List list6 = new List()..length = 10;
//固长
List list7 = new List.unmodifiable([0,1,2]);
//generate生成器
List list8 = new List<int>.generate(5, (int i){
return i + i;
});
//List方法:add()、insert()、remove()、removeAt()、indexOf()、elementAt()等
//Map
Map mapEnt = Map.identity();
print(mapEnt);
Map map = {'one':'Hello', 'two':'Indeex', 'three':'lalala'};
print(map);
Map map1 = new Map();
map1["one"] = 'Hello';
map1["two"] = 'Indeex';
map1["three"] = 'lalala';
print(map1);//{one: Hello, two: Indeex, three: lalala}
map1.forEach((key,value) {
print("key:${key}, value:${value}");
});
//引用
Map map2 = Map.of(map1);
print(map2);
Map map3 = Map.fromEntries(map1.entries);
print(map3);
//副本
Map map4 = Map.unmodifiable(map3);
print(map4);
List<String> keys = ['one','two'];
List<String> values = ['Android','IOS'];
Map map5 = Map.fromIterables(keys, values);
print(map5);
var mapType = new Map<int,String>();
//Runes字符符号
var clapp = '\u{1f44f}';
print(clapp);//👏
print(clapp.codeUnits);//[55357, 56399]
print(clapp.runes.toList());//128079]
Runes input = new Runes('\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));//♥ 😅 😎 👻 🖖 👍
//Symbols
var name = 'indeex';
Symbol symbol = #name;
print(symbol);//Symbol("name");
print(#name);//Symbol("name");
//function:词法作用域/静态作用域 闭包同 可选返回值
bool isnull(int num) {
return list[num] != null;
}
bool isnull(int num) => list[num] != null;
String say(String from, String msg = "Hello", [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
void dosome({List<int> list = const [1, 2, 3], Map<String, String> gifts = const {'first': 'paper', 'second': 'cotton', 'third': 'leather'}}) {
print('list: $list');
print('gifts: $gifts');
}
//级联
querySelector("#element")
..text = "Waooooo!"
..onClick.listen(reverseText);
//匿名函数
var list = ['🍎', '🍊', '🍌', '🍉'];
list.forEach((i) => print(list.indexOf(i).toString() + ': ' + i));
//is as
a is b//true false
c as d
//do while while do
while (true) {
//dosomething
if(true) continue;
if(false) break;
}
do {
//dosomething
} while (true);
//swhich
switch (var) {
case 'value':
//dosomething
break;
case 'value1':
//dosomething
default:
//doothersomething
}
//Error 异常
throw '出错啦!';
try {
//dosomething
} catch(e) {
print('异常: $e');
} finally {//可以没有次流程
//doothersomething
}
//class
class Person {
String name;
int age;
Point(this.name, this.age);
}
//工厂构造
class Logger {
final String name;
bool mute = false;
static final Map<String, Logger> _cache = <String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = new Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) {
print(msg);
}
}
}
var logger = new Logger('UI');
logger.log('点击按钮');
//getter setter
class Rectangle {
num left;
num top;
num width;
num height;
Rectangle(this.left, this.top, this.width, this.height);
num get right => left + width;
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
//抽象类
class chouxiang extends AbstractContainer {
void updateChildren() {
}
void doSomething();//会有警告
}
//接口 没有直接接口关键字
class Person {
final _name;
Person(this._name);
String greet(who) => 'Hello, $who. I am $_name.';
}
//接口实现
class Imposter implements Person {
final _name = "";
String greet(who) => 'Hi $who. Do you know who I am?';
}
greetBob(Person person) => person.greet('hungking');
main() {
print(greetBob(new Person('indeex')));
print(greetBob(new Imposter()));
}
//多个接口
class Point implements Comparable, Location {
//dosomething
}
//扩展类
class Television {
void turnOn() {
_illuminateDisplay();
_activateIrSensor();
}
//...
}
class SmartTelevision extends Television {
void turnOn() {
super.turnOn();
_bootNetworkInterface();
_initializeMemory();
_upgradeApps();
}
//...
}
//override
class A {
@override
void noSuchMethod(Invocation mirror) {
// 。。。
}
}
//枚举类型
enum Color {
red,
green,
blue
}
//静态类
class Point {
static const red = const Color('red');
num x;
num y;
Point(this.x, this.y);
static num distanceBetween(Point a, Point b) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
}
main() {
var a = new Point(2, 2);
var b = new Point(4, 4);
var distance = Point.distanceBetween(a, b);
assert(distance < 2.9 && distance > 2.8);
}
//范型
T first<T>(List<T> ts) {
T tmp ?= ts[0];
return tmp;
}
//import
//内置库
import 'dart:html';
import 'package:lib2/lib2.dart' as lib2;
new lib2.Dosomething();
//导入指定
import 'package:lib1/lib1.dart' show foo;
//导入除指定
import 'package:lib2/lib2.dart' hide foo;
//延迟导入 deferred async await
import 'package:deferred/hello.dart' deferred as hello;
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
//元数据Metadata @deprecated、@override,@proxy
class Television {
@deprecated
void activate() {
turnOn();
}
void turnOn() {
print('on!');
}
}
import 'todo.dart';
@todo('seth', 'make this do something')
void doSomething() {
print('dosomething');
}
code enjoy! 🐾🐾🐾🐾🐾🐾🐾🐾🐌🐝
作者:indeex
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。