flutter开发之——Dart中的函数

前言

Dart是一个真正的面向对象语言,方法也是对象并且具有一种类型Function。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。 也可以把Dart类的实例当做方法来调用。大家可以通过阅读lambda表达式与Kotlin高阶函数Kotlin中的函数类似对比学习。首先通过hello world了解一下Dart中的函数:

_printHello("白瑞德");
void _printHello(String name) {
  print("hello: ${name}");
}
>>> hello: 白瑞德

注意:Dart没有public、protected、private的概念。但是如果变量或函数以下划线_开始,则该函数或变量属于这个包私有(private)的方法。

函数的定义

函数定义指定特定任务的执行方式。在使用函数之前,必须先定义它。dart中函数的定义和Java中的类似。由函数入参、返回结果类型和函数体组成

String function_name(String parma) { 
   //statements 
}

void function_name(String parma) { 
   //statements 
}

function_name(parma) { 
   //statements 
   return 2;
}

其中void关键字表示该函数不向滴啊用这返回任何值,可以省略不写。函数的入参也可以忽略参数类型,这样函数默认接受dynamic类型的参数,也就是任何类型都可以传递。当省略了返回值类型的时候,也会默认返回值的类型为dynamic
注意:dynamic类型可能会带来运行时异常:

_printInt(int name) {
  return "Hello";
}

_printInt(_printInt(2))

这段代码会报:type 'String' is not a subtype of type 'int'
注意:上述三个function_name是不可以出现在同一个代码块里,有Java开发经验的一定知道这种形式就是Java函数的重载,但这在Dart里是行不通的,Dart里有其他方式实现这种重载。
对于只有一个表达式的方法,可以选择使用缩写语法来定义:
String function_name(name) => name+name;
函数体只能是一个表达式,不能使用语句(if-else)

可选参数

Dart中没有类似Java重载的函那样的函数,我们可以使用可选参数来实现类似的功能。
可选参数可以是命名参数或者基于位置的参数,但是这两种参数不能同时当做可选参数。

可选命名参数

调用方法的时候,你可以使用这种形式paramName: value来指定命名参数。一个函数可以同时拥有可选参数和必选参数,但是必选参数必须在最前面
例如:

_printInt(age: 19,address: "粤海街道");
_printHello("白瑞德",age: 19);
_printInt({int age,String address}) {
  ...
}
_printHello(name,{int age,String address}) {
  ...
}

在可选参数的时候,可以使用=来定义可选参数的默认值。默认值只能是编译时常量。如果没有提供默认值,则默认值为null。

//年龄默认为7,而address默认为null
_printHello(name,{int age = 7,String address}) {
    ...
}

可选位置参数

把一些方法的参数放到[]中就变成可选位置参数了:

_printString("白瑞德");
_printString([String name,int age = 7,String address]){
      ...
}

可选的命名参数的声明使用“{}”,使用“:”指定默认值,可选的位置函数的声明使用“[]”,使用“=”指定默认值。

重载与构造方法

Dart语言是同名函数的,即使入参不同。那么问题就来了,构造函数怎么办?难道只能一个构造函数吗?答案是否定的。
Dare支持命名构造函数,使用命名构造函数可以为一个类实现多个构造函数, 或者使用命名构造函数来更清晰的表明你的意图:

class User {
  String name;
  User.init();
  User.initName(name){
    this.name = name;
  }
}

注意:构造函数不能继承,所以超类的命名构造函数 也不会被继承。如果你希望 子类也有超类一样的命名构造函数, 你必须在子类中自己实现该构造函数。
默认情况下,子类的构造函数会自动调用超类的无名无参数的默认构造函数。 超类的构造函数在子类构造函数体开始执行的位置调用。如果提供了一个 initializer list(初始化参数列表),则初始化参数列表在超类构造函数执行之前执行。 下面是构造函数执行顺序:

  • initializer list(初始化参数列表)
  • superclass’s no-arg constructor(超类的无名构造函数)
  • main class’s no-arg constructor(主类的无名构造函数)

如果超类没有无名无参数构造函数,则你需要手工的调用超类的其他构造函数。在构造函数参数后使用冒号 (:) 可以调用 超类构造函数。
由于超类构造函数的参数在构造函数执行之前执行,所以参数可以是一个表达式或者一个方法调用:

class Student extends User{
  Student.init() : super.init();
  Student.initName(name):super.initName(name){
  }
}

一等方法对象

在Dart中,有一种函数被称为:Functions as first-class objects一等方法对象。可一把方法当做参数调用另外一个方法,也可以把方法赋值给一个变量。

printElement(element) {
  print(element);
}
var list = [1, 2, 3];
list.forEach(printElement);

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');

lambda/匿名函数/闭包

大部分方法都带有名字。也可以创建没有名字的方法,称之为匿名方法,有时候也被称为Lambda或者闭包,这是一种表示函数的简介方式。可以把匿名方法赋值给一个变量。

var printName =(num){
    print(num);
    return num;
};
//当只有一行表达式时,可以使用箭头函数
var printName =(num) => print(num);

一个闭包是一个方法对象,不管该对象在何处被调用,该对象都可以访问其作用域内的变量。方法可以封闭定义到其作用域内的变量。下面的示例中,makeAdder()捕获到了变量addBy。不管你在那里执行makeAdder() 所返回的函数,都可以使用addBy参数。

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

结语

Dart中的函数使用基本讲解完毕了,想要进一步了解的可以去官方教程上学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容