编程-学习-思考

Dart 语言学习笔记(二)

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 {

}

好了,就到这里吧! 语言千变万化,我们应该学习一些最基础最本质的东西,这样才会走的更远。