diff --git a/README.md b/README.md index 70dbaf8..a668e12 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Quick Reference [Bash](./docs/bash.md) [C](./docs/c.md) +[Dart](./docs/dart.md) [Docker](./docs/docker.md) [Dockerfile](./docs/dockerfile.md) [Django](./docs/djiango.md) @@ -42,10 +43,10 @@ Quick Reference [Markdown](./docs/markdown.md) [MySQL](./docs/mysql.md) [MATLAB](./docs/matlab.md) -[PHP](./docs/php.md) -[Python](./docs/python.md) +[PHP](./docs/php.md) +[Python](./docs/python.md) [PostgreSQL](./docs/postgres.md) -[Ruby](./docs/ruby.md) +[Ruby](./docs/ruby.md) [Rust](./docs/rust.md) [Swift](./docs/swift.md) [SwiftUI](./docs/swiftui.md) diff --git a/docs/dart.md b/docs/dart.md new file mode 100644 index 0000000..627a856 --- /dev/null +++ b/docs/dart.md @@ -0,0 +1,598 @@ +Dart 备忘清单 +=== + +包含最重要概念、功能、方法等的 [Dart](https://dart.dev/) 备忘单。初学者的完整快速参考 + +入门 +----- + +### 安装 Dart + + +#### Windows + +```bash +C:\> choco install dart-sdk # Windows +``` + +#### Linux + +执行以下一次性设置 + +```bash +$ sudo apt-get update +$ sudo apt-get install apt-transport-https +$ wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg +$ echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list +``` + +安装 Dart SDK + +```bash +$ sudo apt-get update +$ sudo apt-get install dart +``` + +#### Mac + +```bash +$ brew tap dart-lang/dart +$ brew install dart +``` + +### hello.dart + +```dart +// 应用执行开始的顶级函数 +void main() { + print("Hello World!"); // 打印到控制台 +} +``` + +每个应用程序都有一个 `main()` 函数 + +#### Windows + +```bash +$ dart compile exe hellow.dart +$ time ./hello.exe +Hello World! +``` + +### 变量 + +```dart +int x = 2; // 显式键入 +var p = 5; // 类型推断 - 具有类型推断的通用var +dynamic z = 8; // 变量可以采用任何类型 +z = "cool"; // cool + +// 如果您从不打算更改变量,请使用 final 或 const +// 像这样的东西: +final email = "temid@gmail.com"; +// 与 var 相同,但不能重新分配 +final String email = "temid@gmail.com"; +// 你不能改变价值 +const qty = 5; // 编译时常数 +``` + +### 数据类型 + + +```dart +// 整数,范围 -2^63 到 2^63 - 1 +int age = 20; +// 浮点数字 + +double height = 1.85; +// 您还可以将变量声明为 num +// x 可以同时具有 int 和 double 值 +num x = 1; +num += 2.5; +print(num); // 打印: 3.5 + +String name = "Nicola"; +bool isFavourite = true; +bool isLoaded = false; +``` + +### 注释 + +```dart +// 这是一条正常的单行注释 +/// 这是一个文档注释,用于文档库, +/// 类及其成员。 IDE 和 dartdoc 等工具 +/// doc 特别注释。 +/* 也支持此类注释 */ +``` + +### 字符串插值 + +```dart +// 可以对字符串类型使用单引号或双引号 +var firstName = 'Nicola'; +var lastName = "Tesla"; +// 可以用 $ 将变量嵌入到字符串中 +String fullName = "$firstName $lastName"; +// 与 + 连接 +var name = "Albert " + "Einstein"; +String upperCase = '${firstName.toUpperCase()}'; +print(upperCase); // 打印: NICOLA +``` + + +### 导入 Imports + +```dart +// 导入核心库 +import 'dart:math'; +// 从外部包导入库 +import 'package:test/test.dart'; +// 导入文件 +import 'path/to/my_other_file.dart'; +``` + +操作符 +------- + +### 算术运算符 + + +```dart +print(2 + 3); // 打印: 5 +print(2 - 3); // 打印: -1 +print(2 * 3); // 打印: 6 +print(5 / 2); // 打印: 2.5 - 结果是 double +print(5 ~/ 2); // 打印: 2 - 结果是n int +print(5 % 2); // 打印: 1 - 余 +int a = 1, b; +``` + +---- + +```dart +// 增 +b = ++a; // 前增量 - 在 b 获得其值之前增加 a +b = a++; // 后增量 - 在 b 获得它的值之后增加 a +// 递 +b = --a; // 前减量 - 在 b 获得它的值之前减少 a +b = a--; // 后减量 - 在 b 获得它的值之后递减 a +``` + +### 逻辑运算符 + + +```dart +// !expr 反转表达式(将 false 更改为 true,反之亦然) +// || 逻辑或 +// && 逻辑与 +bool isOutOfStock = false; +int quantity = 3; +if (!isOutOfStock && (quantity == 2 || quantity == 3)) { + // ...Order the product... +} +``` + +### 等式和关系运算符 + +```dart +print(2 == 2); // 打印: true - 平等的 +print(2 != 3); // 打印: true - 不相等 +print(3 > 2); // 打印: true - 比...更棒 +print(2 < 3); // 打印: true - 少于 +print(3 >= 3); // 打印: true - 大于或等于 +print(2 <= 3); // 打印: true - 小于或等于 +``` + +控制流:条件 +------ + +### if 和 else if + +```dart +if(age < 18){ + print("Teen"); +} else if( age > 18 && age <60){ + print("Adult"); +} else { + print("Old"); +} +``` + +### switch case + +```dart +enum Pet {dog, cat} +Pet myPet = Pet.dog; +switch(myPet){ + case Pet.dog: + print('My Pet is Dog.'); + break; + case Pet.cat: + print('My Pet is Cat.'); + break; + default: + print('I don\'t have a Pet'); +} +// 打印: My Pet is Dog. +``` + +控制流:循环 +----- + +### while 循环 + +```dart +while (!dreamsAchieved) { + workHard(); +} +``` + +循环迭代之前的 `while` 循环检查条件 + +### do-while 循环 + +```dart +do { + workHard(); +} while (!dreamsAchieved); +``` + +`do-while` 循环在执行循环内的语句后验证条件 + +### for 循环 + +```dart +for(int i=0; i< 10; i++){ + print(i); +} +var numbers = [1,2,3]; +// 列表的 for-in 循环 +for(var number in numbers){ + print(number); +} +``` + +Collections +------------ + +### Lists + + +```dart +// 有序的对象组 +var list = [1, 2, 3]; +print(list.length); //Print: 3 +print(list[1]); //Print: 2 +// 列表声明和初始化的其他方式 +List cities = ["New York", "Mumbai", "Tokyo"]; +// 创建一个编译时常量的列表 +const constantCities = const ["New York", "Mumbai", "Tokyo"]; +``` + +### Maps + + +```dart +// 映射是关联键和值的对象 +var person = Map(); +// 要初始化地图,请执行以下操作: +person['firstName'] = 'Nicola'; +person['lastName'] = 'Tesla'; +print(person); +// 打印: {firstName:Nicola, lastName:Tesla} +print(person['lastName']); +// 打印: Tesla + +var nobleGases = { + // Key: Value + 2: 'helium', + 10: 'neon', + 18: 'argon', +}; +``` + +### Sets + + +```dart +// Dart 中的集合是唯一项的无序集合 +var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'}; +// 创建一个空集 +var names = {}; +Set names = {}; // 这也有效 +//var names = {}; // 创建地图,而不是集合 +``` + +函数 +------ + +### 函数示例 + +```dart +// dart 中的函数是对象并且有一个类型 +int add(int a, int b){ + return a+b; +} +// 函数可以分配给变量 +int sum = add(2,3); // 回报:5 +// 可以作为参数传递给其他函数 +int totalSum = add(2, add(2,3)); // 返回:7 +``` + +### 箭头语法 (=>) + +```dart +// 只包含一个表达式的函数,您可以使用简写语法 +bool isFav(Product product) => favProductsList.contains(product); +``` + + +### Anonymous (lambda) functions + +```dart +// 没有名字的小单行函数 +int add(a,b) => a+b; +// lambda 函数大多作为参数传递给其他函数 +const list = [ + 'apples', 'bananas', 'oranges' +]; + +list.forEach( + (item) => + print('${list.indexOf(item)}: $item') +); +// 打印: 0: apples 1: bananas 2: oranges +``` + + +类和对象 +---------- + +### 类 Class + +```dart +class Cat { + String name; + // 方法 + void voice(){ + print("Meow"); + } +} +``` + +### 对象 Object + +```dart +// 类的实例 +// 在 myCat 下面是 Cat 类的对象 +void main(){ + Cat myCat = Cat(); + myCat.name = "Kitty"; + myCat.voice(); // 打印: Meow +} +``` + +### 构造函数 + +```dart +class Cat { + String name; + Cat(this.name); +} +void main(){ + Cat myCat = Cat("Kitty"); + print(myCat.name); // 打印: Kitty +} +``` + +### 抽象类 + +```dart +// 抽象类——不能实例化的类 +// 这个类被声明为抽象的,因此不能被实例化 +abstract class AbstractContainer { + // 定义构造函数、字段、方法... + void updateChildren(); // 抽象方法 +} +``` + +### Getters Setters + +```dart +// 提供对对象属性的读写访问 +class Cat { + String name; + // getter + String get catName { + return name; + } + // setter + void set catName(String name){ + this.name = name; + } +} +``` + +隐式接口 +------------ + +### 一个基本的界面 + + +```dart +// 一个人。隐式接口包含 greet()。 +class Person { + // 在接口中,但仅在此库中可见。 + final String _name; + // 不在接口中,因为这是一个构造函数。 + Person(this._name); + // 在接口中 + String greet(String who) => 'Hello, $who. I am $_name.'; +} +// Person 接口的实现。 +class Impostor implements Person { + String get _name => ''; + String greet(String who) => 'Hi $who. Do you know who I am?'; +} +String greetBob(Person person) => person.greet('Bob'); +void main() { + print(greetBob(Person('Kathy'))); + // 打印: Hello, Bob. I am Kathy. + print(greetBob(Impostor())); + // 打印: Hi Bob. Do you know who I am? +} +``` + +### 扩展类 + +```dart +class Phone { + void use(){ + _call(); + _sendMessage(); + } +} +// 使用 extends 创建子类 +class SmartPhone extends Phone { + void use(){ + // 使用 super 来引用超类 + super.use(); + _takePhotos(); + _playGames(); + } +} +``` + +异常 +----- + +### Throw + +```dart +// 抛出 throws 或引发 raises 和异常 exception +throw IntegerDivisionByZeroException(); +// 你也可以抛出任意对象 +throw "Product out of stock!"; +``` + +### Catch + +```dart +try { + int c = 3/0; + print(c); +} on IntegerDivisionByZeroException { + // 一个特定的异常 + print('Can not divide integer by 0.') +} on Exception catch (e) { + // 任何其他异常情况 + print('Unknown exception: $e'); +} catch (e) { + // 没有指定类型,处理所有 + print('Something really unknown: $e'); +} +``` + +### Finally + +```dart +// 确保某些代码无论是否抛出异常都能运行 +try { + cookFood(); +} catch (e) { + print('Error: $e'); // 先处理异常 +} finally { + cleanKitchen(); // 然后清理 +} +``` + +Futures +------------ + +### Async Await + +```dart +// 异步函数:它们在设置可能耗时的操作后返回 +// async 和 await 关键字支持异步编程 +Future login() { + String userName="Temidjoy"; + return + Future.delayed( + Duration(seconds: 4), () => userName + ); +} +// 异步 +main() async { + print('Authenticating please wait...'); + print(await userName()); +} +``` + +各种各样的 +------------ + +### Null 和 Null 感知 + + +```dart +int x; // 任何对象的初始值为 null +// ?? 空感知运算符 +x ??=6; // ??= 赋值运算符,仅当变量当前为 null 时才为其赋值 +print(x); // 打印: 6 +x ??=3; +print(x); // 打印: 6 - 结果仍然是 6 +print(null ?? 10); // 打印: 10。如果不为空,则显示左侧的值,否则返回右侧的值 +``` + +### 三元运算符 + +```dart +// 条件 ? 条件如果为真 : 条件如果为假 +bool isAvailable; +isAvailable ? orderproduct() : addToFavourite(); +``` + + +### 条件属性访问 + + +```dart +userObject?.userName +// 上面的代码片段等效于以下代码: +(userObject != null) ? userObject.userName : null +// 您可以将 ? 的多种用途链接起来。一起在一个表达式中 +userObject?.userName?.toString() +// 如果 userObject 或 userObject.userName 为 null,则前面的代码返回 null 并且从不调用 toString() +``` + +### 级联符号 (..) + + +```dart +// 允许您对同一对象进行一系列操作 +// 而不是这样做 +var user = User(); +user.name = "Nicola"; +user.email = "nicola@g.c"; +user.age = 24; +// 你可以这样做 +var user = User() + ..name = "Nicola" + ..email = "nicola@g.c" + ..age = 24; +``` + +### 扩展运算符 (...) + +```dart +// 将多个值插入到集合中 +var list = [1, 2, 3]; +var list2 = [0, ...list]; +print(list2.length); // 打印: 4 +``` + +另见 +---- + +- [Dart 官方文档](https://dart.dev/) _(dart.dev)_ diff --git a/docs/python.md b/docs/python.md index 00542ea..00f30f3 100644 --- a/docs/python.md +++ b/docs/python.md @@ -1232,3 +1232,10 @@ else: # try/except 块的可选子句。 必须遵循除块 finally: # 在所有情况下执行 print("我们可以在这里清理资源") ``` + +另见 +---- + +- [Python](https://www.python.org/) _(python.org)_ +- [Learn X in Y minutes](https://learnxinyminutes.com/docs/python/) _(learnxinyminutes.com)_ +- [Regex in python](./regex.md#python-中的正则表达式) _(quickref.me)_ diff --git a/docs/quickreference.md b/docs/quickreference.md index 2880258..c639531 100644 --- a/docs/quickreference.md +++ b/docs/quickreference.md @@ -95,7 +95,7 @@ npm run start # 监听 md 文件编译输出 HTML ```markdown [Django](./docs/djiango.md) ``` - + 添加 `contributing` 类名,会在卡片下方默认添加 `👆待完善需要您的参与` @@ -108,7 +108,7 @@ class=tag&data-info=👆看看还缺点儿什么? ```markdown [Django](./docs/djiango.md) ``` - + 添加 `class=tag&data-lang=Python` 类名和参数,会在卡片右上角标记 _`Python`_ @@ -127,7 +127,7 @@ Markdown 语法注释 卡片 Markdown 内容展示,下面注释语法为文字内容改变样式 ``` - + 上面基础示例,使用 `col-span-2` 类标识,卡片占 `2` 列位置,参考现有备忘清单的源代码是一个好习惯! @@ -159,7 +159,7 @@ Markdown 语法注释 ### 标题 ``` - + #### 参数说明 @@ -185,7 +185,7 @@ _我是红色_ **加粗变大红色** ``` - + 上面添加注释样式,文字 _加粗变大红色_ 变`红`并且`大`了 @@ -195,7 +195,7 @@ _我是红色_ \```js function () {} \``` - + ``` 如果代码块内容太长,使用强制换行类(`wrap-text`)解决 diff --git a/scripts/assets/dart.svg b/scripts/assets/dart.svg new file mode 100644 index 0000000..14d15c0 --- /dev/null +++ b/scripts/assets/dart.svg @@ -0,0 +1,3 @@ + + +