当前位置:首页 > 后端开发 > 正文内容

Flutter/Dart第09天:Dart高档特性Pattern形式的概览和用法

邻居的猫1个月前 (12-09)后端开发1877

Dart官方文档:https://dart.dev/language/patterns

重要说明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用情况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。

Pattern形式匹配的界说

官网界说:Patterns are a syntactic category in the Dart language, like statements and expressions. A pattern represents the shape of a set of values that it may match against actual values.

初看界说不太好了解,感觉有点绕,大约意思:形式是Dart言语的一种语法分类,就像声明和表达式相同。形式代表了一组实践值的形状,这个形状能够匹配到实践值。(特别注意:这儿的Pattern和正则表达式没有任何关系!)

有几个重要的概念:语法、形状、匹配

  1. 语法:语法是一个编码言语的根底,可见形式在Dart中的重要程度。
  2. 形状:或许说结构,便是一组实践值是怎么安排在一起的一种笼统(结构界说)。
  3. 匹配:依据一组值的形状,咱们匹配到对应的值。

举一个List列表的比如,或许不是彻底恰当,可是能够帮助咱们了解形式的这段界说:

  1. 语法:final aList = [1, 2, 3];这个是界说列表的句子,其间aList代表变量名,列表选用[]包裹,元素选用,分隔,终究;完毕等等,这些都是Dart中的语法。
  2. 形状:列表选用[]包裹,元素选用,分隔,元素类型int由Dart主动推导出来,这些都是这一组值的形状,便是长什么样。
  3. 匹配:aList[0] == 1依据列表的语法和形状,能够匹配到实践值。

Pattern形式的用处

Pattern形式首要效果:匹配值、解构值。匹配宽和构能够一起效果,需求依据上下文和值的形状或结构详细来看。

首要,形式能够让咱们确认某个值的一些信息,包括:

  1. 有一个清晰的形状(或许结构)。
  2. 是一个清晰的常量。
  3. 它和某个值持平(即可用于比较)。
  4. 有一个清晰的类型。

然后,形式解构能够用一种便当的语法,把这个值进行分化,还能够绑定到某个变量上面。

匹配

匹配便是校验某个值是否契合咱们预期,换句话说,咱们是在检测某个值是否契合某种结构且它的值与指定值持平。

咱们在编码过程中,许多逻辑其实都是在进行形式,举例如下:

// 常数匹配:1 == number ?
switch (number) {
  case 1:
    print('one');
}

// 列表匹配:`obj`是一个2个元素列表
// 元素匹配:`obj`的2个元素值别离为`a`和`b`
const a = 'a';
const b = 'b';
switch (obj) {
  case [a, b]:
    print('$a, $b');
}

解构

当一个目标和一个形式相匹配,那么这个形式能够拜访目标的数据,并能够把这个目标拆分成不同部分。换句话说,这个形式解构了这个目标。

代码样例:如下代码,List列表解构,宽和构形式中的嵌套匹配形式。

// 列表解构:`[a, b, c]`结构`numList`目标
// 1. 匹配:`[a, b, c]`代表了具有3个元素的列表
// 2. 拆分:列表的3个元素,别离赋值给了新的变量`a`、`b`和`cs`
var numList = [1, 2, 3];
var [a, b, c] = numList;
print(a + b + c);

// 列表形式:包括2个元素,且第1个元素是`a`或`b`,第2个元素赋值给变量`c`
switch (list) {
  case ['a' || 'b', var c]:
    print(c);
}

形式的运用场景

在Dart言语总,有几个常见能够运用形式:

  1. 局部变量的声明赋值
  2. forfor-in循环句子。
  3. if-caseswitch-case句子。
  4. 调集相关的操控流

变量声明

咱们能够在Dart答应本地变量声明的任何地方运用形式变量声明,形式变量声明必须由var或许final + 形式组成(这也是Dart的形式变量的语法)。

代码样例:如下代码,运用形式,咱们声明晰abc三个变量(而且完结赋值)。

var (a, [b, c]) = ('str', [1, 2]);

变量赋值

上末节变量声明的代码样例中,其完结已进行了形式变量赋值:首要进行形式匹配,然后解构目标,终究进行遍历赋值。

代码样例:如下代码,选用变量赋值形式,轻松进行了2个元素值交流,而无需运用第3个变量。

var (a, b) = ('left', 'right');
(b, a) = (a, b);
print('$a $b');

Switch和表达式形式

本文最初的样例其完结已说到,任何case的句子其实都包括了一个形式。在case中,能够运用任何的形式,变量赋值的效果域仅在Case句子内部。

Case形式能够匹配失利,它答应操控流:

  1. 匹配并解构switch目标。
  2. 匹配失利,则持续履行匹配。
switch (obj) {
  // 匹配:1 == obj
  case 1:
    print('one');

  // 匹配:[first, last]区间
  case >= first && <= last:
    print('in range');

  // 匹配:Record记载,包括2个字段
  // 赋值:`a`和`b`局部变量(效果域:本Case内部)
  case (var a, var b):
    print('a = $a, b = $b');

  default:
}

// 逻辑或形式:多个case共用
var isPrimary = switch (color) {
  Color.red || Color.yellow || Color.blue => true,
  _ => false
};

switch (shape) {
  case Square(size: var s) || Circle(size: var s) when s > 0:
    print('Non-empty symmetric shape');
}

for和for-in循环形式

首要效果:迭代宽和构调集。

代码样例:如下代码,for循环匹配形式,并解构和赋值给变量。

Map<String, int> hist = {
  'a': 23,
  'b': 100,
};

// 匹配:`MapEntry`类型,持续匹配`key`和`value`命名字段子形式
// 赋值:调用`key`和`value`的`getter`并赋值给`key`和`value`变量
for (var MapEntry(key: key, value: count) in hist.entries) {
  print('$key occurred $count times');
}

// 上诉代码的简写
for (var MapEntry(:key, value: count) in hist.entries) {
  print('$key occurred $count times');
}

其他场景形式

本文前面的章节,咱们首要是展现Dart类型形式宽和构,当然也包括(a, b)内容交流的比如。本章进一步学习其他的场景形式。

经过本章学习,首要处理咱们几个问题:

  1. 什么时候咱们需求用到形式,咱们为什么需求形式?
  2. 形式首要处理什么类型的问题?
  3. 什么样的形式最合适?

解构多个回来值

在之前的学习中,Record记载的用处之一便是聚合多个值,并让函数回来多个值。形式能匹配并解构Record记载,并赋值给局部变量。

代码样例:如下代码,userInfo(json)回来一个方位字段的记载,被解构并把方位值赋值给了nameage局部变量。

// Record记载的运用
var info = userInfo(json);
var name = info.$1;
var age = info.$2;

// Record解构和赋值
var (name, age) = userInfo(json);

解构类实例

目标形式能匹配命名的目标类型,能够解构目标的数据,并调用目标特点的getters办法进行赋值。

代码样例:如下代码,命名类型Foo实例myFoo被解构并进行赋值给onetwo变量。

final Foo myFoo = Foo(one: 'one', two: 2);
var Foo(:one, :two) = myFoo;
print('one $one, two $two');

代数数据类型

目标解构和Switch形式有助于编写代数数据类型风格代码,它比较合适以下几种场景:

  1. 有一群相关联的类型。
  2. 每个类型都有一个相同的操作,但这个操刁难每个类型而言又有差异。
  3. 咱们期望把这个操作能一把完结,而不是把完结散落在每个类型中。

样例代码:如下代码,Shape是一个父类,2个或更多的子类都有核算面积的办法,终究经过calculateArea()函数一把完结了。

sealed class Shape {}

class Square implements Shape {
  final double length;
  Square(this.length);
}

class Circle implements Shape {
  final double radius;
  Circle(this.radius);
}

double calculateArea(Shape shape) => switch (shape) {
      Square(length: var l) => l * l,
      Circle(radius: var r) => math.pi * r * r
    };

校验JSON格局

前面章节,咱们学习了ListMap类型的匹配宽和构,它们也适用于JSON的key-value键值对。

代码样例:如下代码,在已知JSON格局的情况下,咱们能够经过List和Map完结JSON的解构和赋值。

var json = {
  'user': ['Lily', 13]
};

var {'user': [name, age]} = json;

可是,当JSON格局不清晰的情况下,咱们能够经过解构来校验JSON的格局。

代码样例:如下代码,咱们经过case形式,完结了JSON数据的校验和赋值。

if (json case {'user': [String name, int age]}) {
  print('User $name is $age years old.');
}

如上代码,Case形式的匹配和赋值操作如下:

  1. json是一个非空的map,进一步匹配map形式
  2. json包括一个名为user的特点,且它是一个包括2个元素的list类型,list中2个元素类型别离为Stringint
  3. 终究,list的2个元素别离赋值给了nameage局部变量。

我的本博客原地址:https://ntopic.cn/p/2023100401


扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=274

分享给朋友:

“Flutter/Dart第09天:Dart高档特性Pattern形式的概览和用法” 的相关文章

java培训学校,java是什么意思中文

java培训学校,java是什么意思中文

以下是几所知名的Java培训学校及其特点,供您参考:1. 黑马程序员 课程内容:提供《三天从0带你写一个Java小游戏》《9天快速入门Java》《Java从入门到起飞》等多套课程,课程内容丰富,涵盖基础到高级知识。 教学成果:各平台播放量超过770万次,曾主导研发多个行业项目课程,如《瑞...

java算法,基础概念与常用算法解析

java算法,基础概念与常用算法解析

Java是一种广泛使用的高级编程语言,用于开发各种应用程序,包括桌面应用程序、Web应用程序、移动应用程序和游戏等。在Java中实现算法时,通常需要遵循一定的步骤和最佳实践,以确保代码的效率、可读性和可维护性。1. 理解算法:在开始编码之前,确保你完全理解了算法的工作原理。这包括理解算法的输入、输出...

php代码混淆, 什么是PHP代码混淆?

php代码混淆, 什么是PHP代码混淆?

PHP代码混淆(Obfuscation)是一种将代码转换为难以阅读和理解的形式的技术,目的是保护代码不被未经授权的人轻易理解和篡改。这通常用于保护软件的知识产权,防止他人窃取或逆向工程。1. 变量和函数重命名:将变量和函数的名称替换为无意义的字符或数字,使代码更难以理解。2. 代码合并:将多个文件合...

php考试系统,构建高效在线考试平台

php考试系统,构建高效在线考试平台

1. 小马考试(ponyexam): 这是一个基于PHP MySQL开发的免费开源在线教育源代码系统,支持多种题型(单选题、多选题、判断题、填空题等),支持在线考试和自动/人工批阅试卷。适用于各类学校、培训机构和企业内训。2. phpems: 这是一个开源免费的PHP在线考试系统,特别优...

php换行代码, PHP中的换行符

php换行代码, PHP中的换行符

在PHP中,你可以使用不同的方法来换行,具体取决于你的输出目标。以下是几种常见的情况: ```php echo 这是第一行这是第二行; ```2. 在命令行中输出换行: 如果你在命令行界面中输出,可以使用``或`r`(取决于你的操作系统,Windows通常使用`r`,而Linux和m...

c语言四舍五入,二、基本概念

在C语言中,你可以使用`round`函数来执行四舍五入。这个函数是`math.h`头文件的一部分。以下是一个简单的例子,演示了如何使用`round`函数来四舍五入一个浮点数:```cinclude include int main { double number = 3.6; doubl...