1. 指定返回值得函数

/**
* 无返回值的函数
* params: 可以是任意类型(var和Object类型也可以任意类型)。 当然这里的参数类型你可以随意指定我这里已dynamic为例
* 参数类型:你也可以指定var、Object等,再比如说你可以指定num, int,double, String....
* 如果我们对参数没有限制的话可以使用这个
*/
void printDynamicParams(dynamic params){print(params);
}

主函数中我们调用printDynamicParams函数:

main(List<String> arguments) {printDynamicParams(12.33);printDynamicParams('liyahong');printDynamicParams("Dart Method test");printDynamicParams(10);printDynamicParams(true);
}

控制台输出结果:

这里我们可以传入任意类型,适用于参数类型不固定的情况使用。这里大家可能会有一个疑惑,包括我当时学习的时候也有这个疑惑,既然dynamic、var、Object都可以指定任意类型,那它们有什么区别吗?下面我们就来说下这个问题。

  • (1)var

    var是C# 3中引入的,其实它仅仅只是一个语法. var本身并不是一种类型, 其它两者object和dynamic是类型。var声明的变量在赋值的那一刻,就已经决定了它是什么类型。

    如果你这样使用,就会有编译错误:

    var a = 1;
    a = "Test";

  • (2)Object

    object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object.

    它可以赋值为任何类型:

    object a = 1;
    a = "Test";

  • (3)dynamic

    dynamic不是在编译时候确定实际类型的, 而是在运行时。

    所以下面的代码是能够通过编译的,但是会在运行时报错:

    dynamic a = "test";
    a++;

2. 不指定返回值类型的函数

/**
* 我们可以不指定返回值类型,这样的函数返回值默认为Object,也就是说你可以返回任意类型
* params: 可以是任意类型
*/
printReturnObjectParams(Object params){print(params);return params;
}
printObjectParams(Object params){print(params);
}

主函数中我们调用printReturnObjectParams 和 printObjectParams函数:
main(List<String> arguments) {print(printReturnObjectParams("liyahong"));print(printReturnObjectParams(111));print(printReturnObjectParams(12.36));print(printObjectParams(true));printObjectParams('test');
}

控制台输出结果:

由上面的结果可以看出,如果没有返回值得时候默认将会返回null。

3.如果你的函数中只有一个表达式,你可以使用快速写法

/**
* 无返回值类型函数的快速写法
* 注意:这种写法只适用于无返回值 并且 函数体中仅有一个表达式的函数。
*/
void printNumber(num number) => print(number);

主函数中我们调用printNumber函数:

main(List<String> arguments) {
  printNumber(123);
  printNumber(22.3333);
}

控制台输出结果:

这里我们提到了num关键字,在上篇博客中没有讲到,这里简单说一下。

我们先看一下官方对它的说法:

/**
* An integer or floating-point number.
* It is a compile-time error for any type other than [int] or [double]
* to attempt to extend or implement num.
*/翻译:
/**
* 整数或浮点数。
* 除[int]或[double]之外的任何类型都是编译时错误
* 试图扩展或实现num。
*/

也就是说它是一个数值类型,仅支持int 和 double类型。

4.可选参数

一个函数可以有两种参数:可选的和必需的,必需参数放在前面,后面跟可选参数

可选参数可以是位置参数或命名参数,两种都可以有默认值,如果没有提供默认值则为null。但是这两种参数不能同时当做可选参数。

  • (1)可选的命名参数

定义一个函数,使用 {param1, param2, …} 指定命名参数,调用函数时,你可以指定使用命名参数 paramName: value

    无默认值例子:

/**
* 没有默认值
*/
void printBool({bool flag, bool action}) => print("flag: " + flag.toString() + "\r\naction: " + action.toString() + "\r\n");

    有默认值(命名参数使用“:”指定默认值)例子:

/**
* 有默认值
*/
void printDefaultBool({bool flag: false}) => print(flag);

    主函数中我们调用printBool 和 printDefaultBool函数:

main(List<String> arguments) {printBool(flag: true, action: false);printBool(flag: false);printBool();printDefaultBool(flag: true);printDefaultBool();
}

控制台输出结果:

(2)可选的位置参数

把参数用 [ ] 包装起来,就能标识成位置参数

无默认值例子:

/**
* 可选的位置参数
* 无默认值
*/
String msg(String msg, [String time]){if (time != null) {return msg + ' with ' + time;}return msg;
}

有默认值(位置参数使用“=”指定默认值)例子:

/**
* 可选的位置参数
* 有默认值
*/
String msgTwo(String msg, [String time = '2018', String name]){if (time == null) {return msg + " from " + name;}if (name != null) {return msg + " with " + time + " from " + name;}return msg + " with " + time;
}

主函数中我们调用msg 和 msgTwo函数:

print(msg("This is msg content", '2017'));
print(msg("Tiis is msg content"));print(msgTwo("This is msgTwo content", '2017', 'liyahong'));
print(msgTwo("This is msgTwo content", null, 'liyahong'));
print(msgTwo("This is msgTwo content"));

控制台输出结果:

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

5.关于重载

 Dart语言是不支持方法重载( 重载就是方法名相同,参数(个数或类型)不同(称之为签名不同))的。这里可能会有人问:“Dart不支持方法重载,那构造函数怎么办呢?”,虽然Dart它不支持方法的重载,但是它支持命名构造函数,我们通过下面例子学习一下:

  class Test{int x;int y;Test(){}Test.X(int x){this.x = x;}Test.Y(int y){this.y = y;}Test.XY(int x, int y){this.x = x;this.y = y;}@override
    String toString() {if (x != null && y != null) {return "x: " + x.toString() + " y: " + y.toString();}      if (x != null) {return "x: " + x.toString();}if (y != null) {return "y: " + y.toString();}return super.toString();}
}

我们在主函数中创建Test对象:

main(List<String> arguments) {Test testX = new Test.X(1);print(testX.toString());Test testY = new Test.Y(2);print(testY.toString());Test testXY = new Test.XY(3, 4);print(testXY.toString());
}

控制台输出结果:

具体内容我们后面讲解。

6.高级函数

/**
* 高级函数
* element 没有指定参数类型,默认Object任何类型
*/
printElement(element){print(element);
}

在主函数中调用printElement函数,这里是将函数作为参数传入

main(List<String> arguments) {var list = ['张三', '李四', '王麻子'];list.forEach(printElement);
}

控制台输出结果:

将一个函数分配给一个变量

main(List<String> arguments) {var loudify = (msg) => '${msg.toUpperCase()}';print(loudify('hello'));
}

控制台输出结果:

7.作用域

dart的作用域跟其他语言一样,直接看一个例子

var test = true;main(List<String> arguments) {var test1 = true;myFunction(){var test2 = true;needFunction(){var test3 = true;assert(test);assert(test1);assert(test2);assert(test3);}}
}

8.闭包

dart的闭包就是函数对象,其实跟JavaScript的闭包函数差不多,理论请参考JavaScript的闭包函数,这里直接写个例子

//返回一个函数对象,功能是返回累加的数字
Function makeAdder(num addBy) {return (num i) => addBy + i;
}main(List<String> arguments) {//创建一个函数add2,add2返回2var add2 = makeAdder(2);//创建一个函数add4,add4返回4var add4 = makeAdder(4);//add2返回2+3assert(add2(3) == 5);//add4返回4+3assert(add4(3) == 7);
}

9.函数是否相等

测试高阶函数、静态方法和实例方法是否相等

//一个高阶函数
foo() {}class SomeClass {//一个静态方法static void bar() {}//一个实例方法void baz() {}
}main(List<String> arguments) {var x;//比较高阶函数x = foo;assert(foo == x);//比较静态方法x = SomeClass.bar;assert(SomeClass.bar == x);//比较实例方法var v = new SomeClass();var w = new SomeClass();var y = w;x = w.baz;assert(y.baz == x);assert(v.baz != w.baz);
}

转载于:https://www.cnblogs.com/lxlx1798/p/11011663.html

【dart学习】-- Dart之函数相关推荐

  1. Flutter 学习 - Dart 语言基础

    文章目录 前言 一.Dart 概述 Dart 重要的概念 二.变量与基本数据类型 三.函数 四.运算符 五.流程控制语句 六.异常处理 七.面向对象 构造函数 继承类 抽象类 枚举类型 八.泛型 九. ...

  2. Dart 学习笔记一(操作符、方法与异常)

    目录 Dart变量 final和const修饰符 Dart的内置类型 numbers Strings Booleans Lists(列表) Maps(映射集合) Runes(用于在字符串中表示Unic ...

  3. 【Flutter】Dart 技巧 ( 独立主函数入口 | 可空类型判定 | 默认值设定 )

    文章目录 一.独立主函数入口 二.可空类型判定 三.默认值设定 四.完整代码示例 五. 相关资源 一.独立主函数入口 在 dart 文件中声明 main() 函数 , 即可脱离 Flutter 环境 ...

  4. dart系列之:dart语言中的函数

    文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...

  5. Dart学习笔记01:环境搭建与开发环境配置

    文章目录 一.Dart概述 二.下载Dart for Windows 三.安装Dart for Windows 四.命令行方式安装Dart (一)安装Chocolatey 1.启动PowerShell ...

  6. Dart学习3、数据类型详解

    常用数据类型 Numbers(数值) int double //Int 必须是整型 int a = 123; a = 456; //Double 既可以是整型,又可以是浮点型 double b = 1 ...

  7. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:     常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:     下面是Po ...

  8. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  9. excel公式 某一个单元格等于另一个单元格的值_EXCEL函数学习5——COUNTIF函数

    [标签] excel函数.统计函数 前面我们学习了COUNT函数,我们回顾一下: count函数很简单,就是统计一个或多个区域的数字个数.相对来说,countif函数多了一个if,也就是可以增加条件了 ...

最新文章

  1. 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
  2. PacBio单分子长测序
  3. 麦肯锡报告摘译:未来成功城市的14个特征
  4. pytorch for循环性能对比
  5. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)
  6. Linux学习笔记04
  7. onclick实现超链接_给超链接加onclick事件
  8. bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!
  9. 最小生成树之普里姆算法(Prim算法)
  10. Java基础__Integer类型中的自动装箱
  11. python html做界面_[Python]简单的HTML页面合并脚本
  12. Hadoop2.7.3完全分布式集群搭建(三节点)
  13. WPF中使用ItemsControl嵌套绑定,在ItemsControl中嵌套一个ItemsControl,然后使用绑定(2)...
  14. Java经典设计模式(3):十一种行为型模式(附实例和详解)
  15. Angular 2 Decorators - 2
  16. D2 日报 2019年 03月 12日
  17. 神经网络不胜语__M-P模型似可寻
  18. MATLAB调用Fortran
  19. photoshop ps 替换图片文字
  20. Windows 制作 QQ加好友 或 临时会话 的链接地址

热门文章

  1. python变量类型-python 变量类型 number
  2. python装饰器-python装饰器
  3. 零基础python入门课程-零基础 Python 入门
  4. codeforce 154C - Double Profiles(hash)
  5. 微信小游戏开发(9)- 分包加载
  6. 在IDEA 中用maven创建web项目
  7. exception is the version of xbean.jar correct
  8. nodejs生成多层目录和生成文件的通用方法
  9. [Spring Data MongoDB]学习笔记--建立数据库的连接
  10. 转 ios 里如何判断当前应用的定位服务是否可用