【dart】dart基础学习使用(一):变量、操作符、注释和库操作

news2024/11/26 8:38:51

前言

学习dart语言。

注释

Dart 支持单行注释、多行注释和文档注释。

单行注释

单行注释以 // 开头。Dart 编译器将忽略从 // 到行尾之间的所有内容。

void main() {
  // 这是单行注释
  print('Welcome to my Llama farm!');
}

多行注释

多行注释以 /* 开始,以 / 结束。Dart 编译器会忽略 / 和 */ 之间的所有内容(除非该注释是文档注释;请参阅下一节)。多行注释可以嵌套。

void main() {
  /*
	这是多行注释
	这是多行注释
	*/
  print('Welcome to my Llama farm!');
}

文档注释

文档注释是以 /// 或 /** 开头的多行或单行注释。在连续行中使用 /// 与多行文档注释的效果相同。

在文档注释中,分析器会忽略所有文本,除非这些文本是用括号括起来的。使用括号可以引用类、方法、字段、顶层变量、函数和参数。括号中的名称在文档程序元素的词法范围内解析。

下面是一个文档注释示例,其中引用了其他类和参数:

/// A domesticated South American camelid (Lama glama).
///
/// Andean cultures have used llamas as meat and pack
/// animals since pre-Hispanic times.
///
/// Just like any other animal, llamas need to eat,
/// so don't forget to [feed] them some [Food].
class Llama {
  String? name;

  /// Feeds your llama [food].
  ///
  /// The typical llama eats one bale of hay per week.
  void feed(Food food) {
    // ...
  }

  /// Exercises your llama with an [activity] for
  /// [timeLimit] minutes.
  void exercise(Activity activity, int timeLimit) {
    // ...
  }
}

变量

dart 可以使用 var、final、const和变量基本类型声明变量和常量。
dart语言比较严格,每句表达式后面必须带分号(;)。

变量基本类型声明

基本类型可以直接声明和赋值。

void main() {
  int number = 2; //  整数
  double floatN = 2.0; //  小数
  String str = 'zsk666'; //  字符串
  bool flag = true; //  布尔型
  List arr = [1, 2, 3]; //  数组
  Set setObj = {'a', 'b', 'c'}; //  集合
  Map mapObj = {name: 'zsk', 18: 18, 'hh': 'hh'}; //  键值对、映射
  Null nullV = null; //  null
  print({number, floatN, str, flag, arr, setObj, mapObj, nullV});
}

如果用基本类型来声明,使用前要赋值。如果不赋值,运行会报错。
或者使用避空符?。

String? name;
print(name);

var声明

var 声明一个变量。
若声明时并赋值,这个变量将会根据值类型定义为相应类型。
若没有赋值,则默认值为null,且类型为object。

  var str = 'string的值'; //  字符串
  var numberV = 18; //  整形
  Object flag = "2";
  flag = '23'; //  重新赋值
  flag = false; //  Object可以跨类型赋值
  var oV; //  默认值 null
  var oA;
  oA = 1;
  oA = 'zsk666';  //  和 Object 声明一样
  print({str, numberV, flag, oV, oA});

结果:
在这里插入图片描述

final 声明

final声明的变量只能赋值一次,赋值后成为常量,不可更改。

void finalSet() {
  final oneV;
  oneV = '哈哈哈';
  final twoV = '123';
  twoV = '1'; //  报错,不能再次赋值
  print({oneV, twoV});
}

const 声明

const 声明的是常量。声明时必须赋值。

/**
 * const 声明
 */
void constSet() {
  const cV1 = [];
  // cV1 = 1; //  报错,常量不能赋值
  const cV2; //  报错,声明时未赋值
  cV2 = '123';
  print({cV1});
}

late 声明的变量

后期修饰符有两种用途:

  • 声明一个非空变量,并在声明后初始化该变量。
  • 懒散地初始化一个变量。
    通常情况下,Dart 的控制流分析可以检测到非空变量在使用前被设置为非空值,但有时分析会失败。两种常见的情况是顶层变量和实例变量:Dart 通常无法确定它们是否被设置,因此不会尝试。
    作用1:
    顶层变量未初始化时,在函数中赋值并使用,会报错,此时可以使用避空符(?)或者late。
    要注意的是 使用late 的变量要确定后面使用前已经正确赋值。
late String aaV;
int? aaV3;
void lateSet() {
  aaV = '123';
  String aaV2;
  aaV2 = '2';
  print({aaV, aaV2, aaV3});
}

作用2:
当作延迟变量使用。类似于懒加载。
例如 :
temperature没有使用,就不会调用readThermometer。使用才会调用。

late String temperature = readThermometer(); // Lazily initialized.

操作符

Dart 支持下表所示的操作符。表中从高到低显示了 Dart 的操作符关联性和操作符优先级,它们是 Dart 操作符关系的近似值。

描述操作符关联性
一元后缀expr++, expr- -, () , [], ?[], . , ?. , !
一元前缀缀++expr, --expr, -expr , !expr , ~expr , await expr
乘除*, / , %, ~/
加减+ , -
左移<< , >>, >>>
位操作 并&
位操作 异或^
位操作 或|
关系符>=, > , <=, < , as , is , is!
比较符== , !=
逻辑 并&&
逻辑 或||
若空符??
条件符expr1 ? expr2 : expr3
连接调用(级联)符… , ?..
计算符= , *=, /=, +=, -=, &=, ^=

在运算符表中,每个运算符的优先级都高于其后各行的运算符。例如,乘法运算符 % 的优先级高于相等运算符 ==(因此先于相等运算符 == 执行),而相等运算符 == 的优先级高于逻辑 AND 运算符 &&。这种优先级意味着下面两行代码的执行方式相同:

// Parentheses improve readability.
if ((n % i == 0) && (d % i == 0)) ...

// Harder to read, but equivalent.
if (n % i == 0 && d % i == 0) ...
void main() {
  //  算数运算
  assert(2 + 3 == 5);
  assert(2 - 3 == -1);
  assert(2 * 3 == 6);
  assert(5 / 2 == 2.5); // Result is a double
  assert(5 ~/ 2 == 2); // Result is an int
  assert(5 % 2 == 1); // Remainder

  assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');

  //  自操作
  int a;
  int b;

  a = 0;
  b = ++a; // 赋值给b之前 自加1.
  assert(a == b); // 1 == 1

  a = 0;
  b = a++; // 赋值给b之后 自加1.
  assert(a != b); // 1 != 0

  a = 0;
  b = --a; // 赋值给b之前 自减1.
  assert(a == b); // -1 == -1

  a = 0;
  b = a--; // 赋值给b之后 自减1.
  assert(a != b); // -1 != 0

  print({a, b});

  //  比较
  assert(2 == 2);
  assert(2 != 3);
  assert(3 > 2);
  assert(2 < 3);
  assert(3 >= 3);
  assert(2 <= 3);

  //  级联 调用后返回实例,而不是调用后的返回值
  // var paint = Paint()
  //   ..color = Colors.black
  //   ..strokeCap = StrokeCap.round
  //   ..strokeWidth = 5.0;
}

库和导入

导入和库指令可帮助您创建模块化和可共享的代码库。库不仅提供应用程序接口(API),而且还是一个隐私单位:以下划线 (_) 开头的标识符只能在库内可见。即使没有使用库指令,每个 Dart 文件(及其部分)都是一个库。

库可以使用包来发布。

如果您对 Dart 为什么使用下划线而不是 public 或 private 等访问修饰关键字感到好奇,请参阅 SDK 问题 33383。

使用库

使用 import 来指定如何在另一个库的作用域中使用一个库中的命名空间。

例如,Dart Web 应用程序通常使用 dart:html 库,它们可以这样导入:

import 'dart:html';

导入所需的唯一参数是指定库的 URI。

  • 对于内置库,URI 采用特殊的 dart: 方案。

  • 对于其他库,可以使用文件系统路径或 package: 方案。
    package: 方案指定由包管理器(如 pub 工具)提供的库。例如

    import 'package:test/test.dart';
    

库别名

如果要导入的库的内容名称有冲突,可以另起一个别名。
例如,如果 library1 和 library2 都有一个 Element 类,那么代码可能如下:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();

使用库的部分内容

如果只想使用程序库的一部分,可以选择性地导入程序库。例如

// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

实操

创建 two.dart

/// 这是 two.dart
// library;

class Two {
  void start() {
    print('two ,start');
  }
}```

创建 one.dart,导入two.dart并使用。

```dart
import './two.dart';
import './two.dart' as TwoL;

void main() {
  print("Hello,world!");
  Object name = 2;
  Two()..start();
  TwoL.Two()..start();
}

结果:
在这里插入图片描述

结语

结束了。 Dart官网.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KubeFlow组件介绍

kubeflow是一个胶水项目&#xff0c;它把诸多对机器学习的支持&#xff0c;比如模型训练&#xff0c;超参数训练&#xff0c;模型部署等进行组合并已容器化的方式进行部署&#xff0c;提供整个流程各个系统的高可用及方便的进行扩展部署了 kubeflow的用户就可以利用它进行不同的…

合并两个有序的单链表,合并之后的链表依然有序

定义节点 class ListNode {var next: ListNode _var x: Int _def this(x: Int) {thisthis.x x}override def toString: String s"x>$x" } 定义方法 class LinkedList {var head new ListNode(0)def getHead(): ListNode this.headdef add(listNode: Li…

省级专精特新!祝贺旭帆科技荣获安徽省“专精特新”中小企业!

2023年8月&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;成功荣获2023年度“安徽省专精特新中小企业”荣誉称号&#xff0c;成为具备专业化、精细化、特色化、新颖化的“专精特新”企业。 随着《“十四五”促进中小企业发展规划》的深入实…

mysql 查看 、设置缓冲池 buffer_pool

Mysql 存储引擎 MyIsam 和 Innodb 引擎 myIsam 存储引擎&#xff1a; 只缓存索引&#xff0c;不缓存数据&#xff0c;对应的键缓存参数为 key_buffer_size show variables like ‘key_buffer_size’; set global key_buffer_sizexxxx; 或者 my.ini my.cnf [server] key_buffer…

二三维电子沙盘数字沙盘虚拟现实开发教程第14课

二三维电子沙盘数字沙盘开发教程第14课 很久没有写了&#xff0c;主要前段时间在针对怎么显示高精度的 倾斜数据而努力&#xff0c;现在终于实现了效果不错。以前的版本显示倾斜数据控制不太好。 对了。目前系统暂只支持smart3d生成的kml格式的数据&#xff0c;由专有的录入程…

教你如何做正交表

正交表是一种用于多因素实验设计的表格。它可以帮助我们在尽可能少的试验次数下确定各个因素对结果的影响&#xff0c;从而提高实验效率。接下来将从以下几个方面介绍正交表的相关内容。 一、正交表基本概念 正交表是一种特制的表格&#xff0c;用于多因素实验设计研究。根据正…

马蹄集oj赛(第十次)

目录 2的N次幂 升级版斐波那契数列 个数统计 个数统计2 大斐列 AB problem ​编辑 A-B problem 快速幂 进行一个幂的运算 整数大小比较 2的N次幂 难度&#xff1a;黄金 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M 任意给定一个正整数N(N≤100)&#xff0…

Qt6 for Windows 环境搭建(Visual Studio)

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 在 Windows 中&#xff0c;如果想要开发 Qt 应用程序&#xff0c;可以选择多种方式&#xff1a; Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

线上祭奠软件:虚拟纪念与情感表达的新方式

线上祭奠软件作为一种新兴的技术应用&#xff0c;正在改变传统祭奠方式&#xff0c;为人们提供了跨越时空的虚拟纪念和情感表达方式。本文将深入探讨线上祭奠软件的意义、功能与挑战&#xff0c;并思考其对社会和个人的影响。 一、线上祭奠软件的意义&#xff1a; 1.跨…

MyBatis —— 初窥门径

前言 MyBatis作为一款优秀的持久层框架&#xff0c;在Java后端开发中无疑是比较重要一环&#xff0c;在常见的spring整合的SSM框架以及之后的SpringBoot中都可以看到MyBatis大显神威的模样。在这篇文章中&#xff0c;荔枝将会从Maven开启创建一个MyBatis项目并整理MyBatis相应的…

服务器放在香港好用吗?

​  相较于国内服务器&#xff0c;将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案&#xff0c;因此更无备案时限&#xff0c;购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…

函数注解学习

def hanshuzhujie(a:str,b: str m)->str:print(hanshuzhujie.__annotations__)return ab hanshuzhujie(qqq)运营结果 E:\Python\Python38\python.exe D:/pythonprojects/python-auto-test/test/hanshuzhujie.py {a: <class str>, b: <class str>, return: <…

生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能

对于许多人来说&#xff0c;可能因其涉及的期权、认购和价差在内的DeFi而显得晦涩难懂&#xff0c;但Typus Finance找到了一种通过动态NFT使体验更加丰富的方式。Typus NFT系列的Tails为用户带来一个外观逐渐演变并在平台上提升活动水平时获得新特权的角色。 Typus表示&#x…

AI时代,GPGPU和NPU哪个才是王者?

AI飞速发展&#xff0c;全球算力井喷&#xff0c;我国进入AI计算高速发展阶段&#xff0c;GPU的自主化已经摆上案头。近日&#xff0c;华夏银行首席信息官吴永飞发表研究&#xff0c;指出GPGPU是比NPU更合适的路线&#xff0c;并以海光DCU为基础进行了GPU算力池化的研究。 GPG…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

说说我最近筛简历和面试的感受。。

大家好&#xff0c;我是鱼皮。 都说现在行情不好、找工作难&#xff0c;但招人又谈何容易&#xff1f;&#xff01; 最近我们公司在招开发&#xff0c;实习社招都有。我收到的简历很多&#xff0c;但认真投递的、符合要求的却寥寥无几&#xff0c;而且都是我自己看简历、选人…

【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom

下面的例子则是利用get拦截&#xff0c;实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …

路由转发(详细理解+实例精讲)

系列文章目录 华为数通学习&#xff08;5&#xff09; 目录 华为数通学习&#xff08;5&#xff09; 前言 一&#xff0c;最长匹配原则 实例1&#xff1a; 实例2&#xff1a; 二&#xff0c;路由转发流程&#xff1a; 三&#xff0c;IP路由表小结&#xff1a; 总结 前…

公司新招了一个拿14K的测试员,而我工作3年才8K,凭什么?

最近我的好朋友给我分享了一个他公司发生的事&#xff0c;大概的内容呢就是&#xff1a;公司一位工作3年的测试员的工资还没有一个刚来的新人高&#xff0c;对此怨气不小&#xff0c;她来公司辛辛苦苦三年&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天都是按时上下班…

WebGPT VS WebGPU

推荐&#xff1a;使用 NSDT编辑器 快速搭建3D应用场景 随着WebGPU的引入&#xff0c;Web开发发生了有趣的转变&#xff0c;WebGPU是一种新的API&#xff0c;允许Web应用程序直接访问设备的图形处理单元&#xff08;GPU&#xff09;。这种发展意义重大&#xff0c;因为 GPU 擅长…