【dart学习】-- Dart之函数
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之函数相关推荐
- Flutter 学习 - Dart 语言基础
文章目录 前言 一.Dart 概述 Dart 重要的概念 二.变量与基本数据类型 三.函数 四.运算符 五.流程控制语句 六.异常处理 七.面向对象 构造函数 继承类 抽象类 枚举类型 八.泛型 九. ...
- Dart 学习笔记一(操作符、方法与异常)
目录 Dart变量 final和const修饰符 Dart的内置类型 numbers Strings Booleans Lists(列表) Maps(映射集合) Runes(用于在字符串中表示Unic ...
- 【Flutter】Dart 技巧 ( 独立主函数入口 | 可空类型判定 | 默认值设定 )
文章目录 一.独立主函数入口 二.可空类型判定 三.默认值设定 四.完整代码示例 五. 相关资源 一.独立主函数入口 在 dart 文件中声明 main() 函数 , 即可脱离 Flutter 环境 ...
- dart系列之:dart语言中的函数
文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...
- Dart学习笔记01:环境搭建与开发环境配置
文章目录 一.Dart概述 二.下载Dart for Windows 三.安装Dart for Windows 四.命令行方式安装Dart (一)安装Chocolatey 1.启动PowerShell ...
- Dart学习3、数据类型详解
常用数据类型 Numbers(数值) int double //Int 必须是整型 int a = 123; a = 456; //Double 既可以是整型,又可以是浮点型 double b = 1 ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Po ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- excel公式 某一个单元格等于另一个单元格的值_EXCEL函数学习5——COUNTIF函数
[标签] excel函数.统计函数 前面我们学习了COUNT函数,我们回顾一下: count函数很简单,就是统计一个或多个区域的数字个数.相对来说,countif函数多了一个if,也就是可以增加条件了 ...
最新文章
- 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
- PacBio单分子长测序
- 麦肯锡报告摘译:未来成功城市的14个特征
- pytorch for循环性能对比
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K)
- Linux学习笔记04
- onclick实现超链接_给超链接加onclick事件
- bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!
- 最小生成树之普里姆算法(Prim算法)
- Java基础__Integer类型中的自动装箱
- python html做界面_[Python]简单的HTML页面合并脚本
- Hadoop2.7.3完全分布式集群搭建(三节点)
- WPF中使用ItemsControl嵌套绑定,在ItemsControl中嵌套一个ItemsControl,然后使用绑定(2)...
- Java经典设计模式(3):十一种行为型模式(附实例和详解)
- Angular 2 Decorators - 2
- D2 日报 2019年 03月 12日
- 神经网络不胜语__M-P模型似可寻
- MATLAB调用Fortran
- photoshop ps 替换图片文字
- Windows 制作 QQ加好友 或 临时会话 的链接地址
热门文章
- python变量类型-python 变量类型 number
- python装饰器-python装饰器
- 零基础python入门课程-零基础 Python 入门
- codeforce 154C - Double Profiles(hash)
- 微信小游戏开发(9)- 分包加载
- 在IDEA 中用maven创建web项目
- exception is the version of xbean.jar correct
- nodejs生成多层目录和生成文件的通用方法
- [Spring Data MongoDB]学习笔记--建立数据库的连接
- 转 ios 里如何判断当前应用的定位服务是否可用