Dart 语言学习笔记(二)
上次学习了Dart语言的基本类型,这次将看看Dart种的函数、运算符和类有什么特别之处。
函数
写了几个月的flutter后发现,大部分时候都是在给函数传参,所以就有一种错觉,Dart是函数的天下。下面就来介绍一下函数在Dart种的特殊地位。
首先,Dart是一门面向对象语言,所以函数也是一个对象有一个类型那就是Function,因此也可以作为一个变量或者参数。这样在编程种就带来了极大的方便。
定义一个函数形式和其他语言一样:返回值-函数名-参数+函数体。如下所示:
String getAddressByName(String name) {
return _addressBook[name];
}
好了这里说一下和其他地方不一样的地方,首先是返回值,你可以忽略,不过最好还是写上。然后就是参数了,在Dart中可以定义两种参数,一种是必须,另外一种是可选的。那么如何定义他们呢?
定义可选参数
可选参数也就是在函数调用的时候可以选择传入或不传入的参数,在Dart种有两种方式可以选择:使用 [] 和 {} 符号定义的参数。如下所示:
String hello([String name, String greeting]); // 使用 [] 定义可选参数
String hello({String name, String greeting}); // 使用 {} 定义可选参数
那么他们之间有什么不同的,没错在调用的时候参数传入的位置情况不一样。使用 [] 定义的可选参数必须按照函数定义时给的顺序一样,而使用 {} 定义是根据定义时的参数名进行传递的。如下调用:
hello('bob');
hello(name: 'bob');
hello(greeting: 'hey'); // 使用 {} 定义
很喜欢Dart语言地第二种命名可选参数,或许这是参考JS的吧。在编写Flutter Widget的时候这种传参的方法是在是太有用了。
另外你可以在此定义方式中加上 @require 来表示该参数是必须的。
不同之处
下面来了解一下 Dart 语言在函数处理方面有哪些不一样的地方。前面说过函数也是一种类型,所以你就可以定义自己的函数变量,就像C中的函数指针一样,不过在这里没有那么复杂,就像定义整数、字符一样定义一个函数:
// 定义自己的函数类型:
typedef ValueChange(String value);
typedef onDatePass(Date date);
// 或者直接这样:
Function onClickListener(int type);
Function onTapCallBack();
Function onUserInfoUpdate(UserInfo user);
在Flutter中经常会用到这种回调函数。
另外在 Dart 中可以使用 => 运算符来简化函数体:
// 一般这样写
User get() {
return user;
}
// 可以这样写
User get() => return user;
// 还可以这样:
User get() => updateUser(); // 其中 updateUser() 是一个函数
不得不说,这样让代码看起来简洁了许多。
类
下面来说一说 Dart 语言中的类,当然主要讲讲和其他语言不一样的地方。其中包括 成员的公有私有属性的定义,构造函数的定义。
在 Dart 中没有 Java 一样的 private public 修饰符。更没有 protected 一说。那怎么来定义私有成员呢?很简单 变量名前面加上 _ 即下滑线就是私有的了:
int _age; // == Java: private int age;
int _get() => _age; // == Java; private int get() {return age;}
实际上,_ 可以用来任何变量的定义上,包括类,如果类名定义前加了,那么这个类就只在本文件内可见了。
在 Dart 中的构造函数也是很简单,最重要的就是它没有构造函数的重载,也就是没有构造函数名字相同的,为了发明了命名构造函数:
class _Person {
String _name;
int _age;
Person({this._name, this._age}); // 成员变量 可以这样初始化 ;
Person.fromJson(String json); // 用 . 号加名字来 写命名构造函数;
}
继承 接口
Dart 语言的继承也是单继承 使用 extends 关键字。然而在Dart中并没有定义接口的关键字。那是因为每一个类都可以是接口,并可以使用 with 关键字来添加接口:
class Shape {
}
class Method {
}
class Circle extends Shape with Method {
}
好了,就到这里吧! 语言千变万化,我们应该学习一些最基础最本质的东西,这样才会走的更远。