Dart学习笔记2-数据结构
数据类型:
Dart中有以下常见的数据类型:
-
数字类型(Number Types):
- int:表示整数值,例如1、2、-3等。
- double:表示浮点数值,例如3.14、-0.5等。
-
字符串类型(String Type):
- String:表示一串字符,例如"Hello"、"Dart"等。
-
布尔类型(Boolean Type):
- bool:表示逻辑值,只有两个可能的取值:true和false。
-
列表类型(List Type):
- List:表示有序的对象集合,可以包含任意类型的元素。列表使用方括号[]表示,并使用逗号分隔元素。
List<int> numbers = [1, 2, 3, 4, 5];
List<String> names = ['Alice', 'Bob', 'Charlie'];
- 映射类型(Map Type):
- Map:表示键值对的集合,其中每个键都是唯一的。映射使用花括号{}表示,键值对使用冒号:分隔。
Map<String, int> ages = {'Alice': 25, 'Bob': 30, 'Charlie': 35};
- 集合类型(Set Type):
- Set:表示无序的唯一对象的集合。集合使用花括号{}表示,并使用逗号分隔元素。
Set<int> numbers = {1, 2, 3, 4, 5};
-
符号类型(Symbol Type):
- Symbol:表示Dart程序中声明的符号。符号类型通常用于反射和元编程。
-
动态类型(Dynamic Type):
- dynamic:表示任意类型的值。使用dynamic类型可以在运行时动态确定变量的类型。
dynamic value = 10;
value = 'Hello';
除了上述常见的数据类型,Dart还提供了一些其他类型,如枚举类型(enum)、函数类型(Function Type)、类类型(Class Type)等。这些类型在特定的场景下使用,可以提供更多的灵活性和功能。
需要注意的是,Dart是一种强类型语言,每个变量都有一个明确的类型。类型可以在声明变量时显式指定,也可以由Dart的类型推断机制自动推断出来。
函数相关:
在Dart中,函数是一段可重用的代码块,它执行特定的任务并可以接受参数和返回值。函数是Dart编程语言中的基本构建块之一,可以帮助你组织和模块化代码。
以下是关于Dart函数的详细介绍:
- 函数声明和定义:要声明和定义一个函数,你需要指定函数的名称、参数列表和返回类型(如果有)。函数的定义包括函数体,其中包含了实际的代码逻辑。以下是一个简单的函数定义示例:
int sum(int a, int b) {
return a + b;
}
在上面的例子中,函数名是sum,它接受两个整数类型的参数a和b,并返回一个整数类型的值。函数体中的代码逻辑是将a和b相加并返回结果。
- 参数传递:Dart函数可以接受零个或多个参数。参数可以是必需的(required)或可选的(optional)。必需参数在调用函数时必须提供,而可选参数可以省略。Dart中有两种类型的可选参数:命名参数和位置参数。
- 命名参数:命名参数使用大括号{}括起来,并在函数声明中指定参数名称和类型。调用函数时,你可以通过参数名称来传递值。以下是一个使用命名参数的函数示例:
void greet({String name, String message}) {
print('$name says: $message');
}
在上面的例子中,greet函数接受两个命名参数name和message。调用该函数时,你可以通过参数名称来传递值,例如:
greet(name: 'Alice', message: 'Hello');
- 位置参数:位置参数是按照参数的位置来传递值的。它们使用方括号[]括起来,并在函数声明中指定参数名称和类型。以下是一个使用位置参数的函数示例:
void greet(String name, String message) {
print('$name says: $message');
}
在上面的例子中,greet函数接受两个位置参数name和message。调用该函数时,你需要按照参数的位置来传递值,例如:
greet('Alice', 'Hello');
- 返回值:函数可以返回一个值,也可以不返回任何值。如果函数没有指定返回类型或者返回类型为void,则表示该函数不返回任何值。如果函数需要返回一个值,你需要在函数声明中指定返回类型,并使用return语句返回值。以下是一个返回值的函数示例:
int sum(int a, int b) {
return a + b;
}
在上面的例子中,sum函数返回两个整数a和b的和。
- 匿名函数:Dart还支持匿名函数,也称为lambda函数或闭包。匿名函数没有名称,可以直接赋值给变量或作为参数传递给其他函数。以下是一个匿名函数的示例:
var multiply = (int a, int b) {
return a * b;
};
在上面的例子中,multiply是一个变量,它的值是一个匿名函数。该函数接受两个整数a和b,并返回它们的乘积。
函数是Dart编程中非常重要的概念,它们可以帮助你将代码模块化、提高代码的可读性和可维护性。通过合理使用函数,你可以将复杂的问题分解为更小的部分,并通过函数的组合和调用来解决问题。
Class与其关键字:
在Dart中,类方法(class methods)和类变量(class variables)可以使用关键字"static"进行声明。使用"static"关键字声明的方法和变量属于类本身,而不是类的实例。这意味着可以直接通过类名来访问和使用这些方法和变量,而无需创建类的实例。
以下是对"static"关键字的详细解释:
- 静态方法(Static Methods):使用"static"关键字声明的方法称为静态方法。静态方法属于类本身,而不是类的实例。可以通过类名直接调用静态方法,而无需创建类的实例。静态方法通常用于实现与类相关的实用函数或工具函数,这些函数不需要访问类的实例变量。
class MyClass {
static void staticMethod() {
print('This is a static method');
}
}
void main() {
MyClass.staticMethod(); // 直接通过类名调用静态方法
}
在上面的例子中,MyClass类中的staticMethod()是一个静态方法。通过类名MyClass直接调用了staticMethod()。
- 静态变量(Static Variables):使用"static"关键字声明的变量称为静态变量。静态变量属于类本身,而不是类的实例。可以通过类名直接访问和使用静态变量,而无需创建类的实例。静态变量在整个类中是共享的,所有实例都共享相同的静态变量。
class MyClass {
static int staticVariable = 10;
}
void main() {
print(MyClass.staticVariable); // 直接通过类名访问静态变量
}
在上面的例子中,MyClass类中的staticVariable是一个静态变量。通过类名MyClass直接访问了staticVariable。
使用静态方法和静态变量可以提供一些特定的功能和行为,例如实现工具函数、记录全局状态等。它们不依赖于类的实例,因此可以在不创建类的实例的情况下直接使用。需要注意的是,静态方法只能访问静态变量,而不能访问非静态(实例)变量。
总结:通过使用"static"关键字,可以在Dart中声明类的静态方法和静态变量。静态方法和静态变量属于类本身,可以直接通过类名来访问和使用,而无需创建类的实例。
List
首先,我们知道列表(List)在 Dart 语言中十分重要。然而,在 Dart 语言中,List 存在一些特定的约束。比如在函数或者方法体之外,我们不能随意地定义或者改变 List。更明确的说,在类的外部作用域或者类外部,List 必须是常量。
举个例子,字符串和数字是默认常量,所以,当我们想在以上提到的这些地方定义字符串和数字时,它们自动就成为常量,不需要进行其他多余的声明。然而,对于数组(Arrays)和映射(Maps),情况就不同了。他们默认都是非常量。但是,我们可以通过声明它们为“const”来使得它们成为常量。这和 JavaScript 里的 Object.freeze() 方法有点类似。在 Javascript 中,当我们对一个对象使用 Object.freeze() 方法时,该对象就变成了一个不可改变,即常量的对象。
举个 Dart 的例子来说明这个特点: 我们不能这样写:
List<int> myList = [1,2,3,4];
应该这样写:
const List<int> myList = [1,2,3,4];
这样 myList
就成为一个常量列表,不能再对它进行修改操作了。而在 JavaScript 中的等价操作为 Object.freeze()
。
num\int\double
int和double是num的子集。
example11() {
var i = 1 + 320, d = 3.2 + 0.01;
num myNumDouble = 2.2;
num myNumInt = 2;
int myInt = 1;
double myDouble = 0; // Dart will add decimal prefix, becomes 0.0;
myNumDouble = myInt; // valid
myNumDouble = myDouble; //valid
myNumDouble = myNumInt; //valid
myNumInt = myInt; // valid
myNumInt = myDouble; // valid
myNumInt = myNumDouble; // valid
myInt = myNumDouble; //Error
myInt = myDouble; //Error
myInt = myNumInt; //valid
myDouble = myInt; //error
myDouble = myNumInt; //valid
myDouble = myNumDouble; //valid
print("Example11 int ${i}");
print("Example11 double ${d}");
}