接着学习dart的函数。

1、函数Function

dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参进行传递。

我们直接来看一个简单的函数例子吧:

//定义一个函数,名字叫testFunc,,参数有两个int,返回值也是int
int testFunc(int a, int b)
{
return a+b;
}
main() {
var c=testFunc(2,4); //调用刚才定义的函数
print('Function test = $c'); //打印函数的返回值,注意:这里不同于C语言的d%用法
}

函数的运行信息如下图:

附:即便定义的函数没有显式声明函数的返回类型,编译器也能认,但是不建议大家那样做。

如果函数体只有一句表达式,那么还可以这样简介地定义函数:

int testFunc(int a, int b) => a+b;

=> expr; 语法就是 {return expr; } 的简短写法,同样,这种写法个人也不太推荐,我们还是要注意函数定义的易读性。

函数的入参可以是必须的,也可以是可选择的,类似于带有默认值的参数,可选择的参数必须放在必须的参数之后。

<一> 可选参数

可选参数可以是位置参数或者命名参数。当定义函数的时候,可以使用 {param1param2, …} 这种形式去指定命名参数,其实就是下边这种形式:

  int testFunc({int a, int b})  //注意{}
  {
      return a+b;
  }

调用的时候可以这样调用:

main() {
var c=testFunc(a: 2, b:4);
print('Function test = $c');
}

位置参数看以下例子(有点类似于windows cmd 命令里的可选参数):

String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}

以上say函数的前两个参数是必须的,从第三个开始是可选择的参数,这些可选择的参数都被包括在[]符号内。

这样调用:

main() {
var c=say('Jack','Hello world');
print(c);
}

运行结果为:

如果我们这样调用:   var c=say('Jack','Hello world','windows');  ,那么,运行结果将变为:

<二>默认参数

默认参数类似于C/C++语言的默认参数,dart的默认参数也使用=进行赋值(推荐使用=)。命名参数或位置参数都可以有默认值,如上例可以这样修改:

int testFunc({int a=, int b})
{
return a+b;
}
main() {
var c=testFunc(b:);
print('Function test = $c');
}

程序的运行结果为:

这里要特别指出一点:普通C/C++的默认赋值参数只能排在形参的最后,也就是说上例如果在C语言中testFunc函数只能是b有默认值,而a不能有默认值。但是由于我们使用了dart语言的命名参数特性,所以对有默认值形参的位置就没有这些限制了。怎么样,dart还是有自己独特的强大之处吧。

位置参数的带有默认值的形式就不再赘述了,下边直接贴一段例子大家理解消化一下就行:

// demo1
String say(String from, String msg,
[String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
assert(say('Bob', 'Howdy') ==
'Bob says Howdy with a carrier pigeon');
//demo2
void doStuff(
{List<int> list = const [, , ],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}}) {
print('list: $list');
print('gifts: $gifts');
}

<三>main函数

main函数是dart语言编写的程序的顶层入口函数,返回值为void,并且有一个可选择的list参数。不再细述。

<四>将函数作为入参传递或赋值

直接看例子吧:

void printElement(int element) {
print(element);
}
main()
{
var list = [, , ];
// Pass printElement as a parameter.
list.forEach(printElement);
}

再看一个将函数作为变量进行赋值的:

int main()
{
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; //复合语句,稍微有点复杂,大家结合前边对 => 的介绍进行理解
print(loudify('hello'));
}

所有的函数都是有返回值的,如果程序里没有明确指明返回值,如 foo() {}   ,则默认返回 null;

[dart学习]第四篇:函数和操作符(本篇未完待续)的更多相关文章

  1. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  2. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  3. Day4-内置函数--未完待续,慢慢写

    内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 未完待续....

  4. 学习OpenCV——BOW特征提取函数(特征点篇)

    没日没夜的改论文生活终于要告一段落了,比起改论文,学OpenCV就是一件幸福的事情.OpenCV的发展越来越完善了,已经可以直接使用BOW函数来进行对象分类了. 简单的通过特征点分类的方法:     ...

  5. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  6. javascript学习第四课函数

    函数也是一种数据类型:function类型 所以函数也可当作一个数据作参数传递 三种函数的声明示例: 一般来讲,声明方式一和声明方式二比较常用,方式三比较少. 常用函数方式示例: 注意:虽然函数支持嵌 ...

  7. scala 学习笔记四 匿名函数

    1.介绍 Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体. 使用匿名函数后,我们的代码变得更简洁了. 下面的表达式就定义了一个接受一个Int类型输入参数的匿名函数: var ...

  8. python学习第四天-函数

    函数  def开头 函数参数 其中name.age.sex为形参,'王锦时',21,'男'为实参 函数返回值 默认参数 关键字参数 收集参数 相当于把所有实参存在一个元组当中 收集参数和关键字参数的混 ...

  9. 快速傅里叶变换(FFT)学习笔记(未完待续)

    目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...

随机推荐

  1. 2018-2019-1 20189210 《Linux内核原理与分析》第三周作业

    一.学习笔记 计算机的"三大法宝" 1.程序存储计算机. 2.函数调用对栈.堆栈的作用是:记录函数调用框架.传递函数参数.保存返回值地址.提供函数内部局部变量的存储空间.函数调用堆 ...

  2. [LeetCode] Unique Morse Code Words 独特的摩斯码单词

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  3. llinux挂载多个光驱

    因为u盘量产,一个u盘两启,所以linux需要访问多个cdrom(一个物理光驱,一个虚拟光驱),本来一位无法使用,看了看/dev目录下面, [root@linux-node3 cdrom]$ ll / ...

  4. Android学好Shape不再依赖美工

    原创 2014年03月27日 15:33:41 标签: Android Shape用法 20427 先上图 其实以上效果没有让美工提供任何图片 只要学会Shape你就能实现 想怎么样就怎么样 下面介绍 ...

  5. Math工具类

    public static void main(String[] args) { // 工具类,所有方法都以静态方法提供,没有实例存在的意义 // 不提供任何实例的方法,代表当前类属于无状态的. // ...

  6. sleep wait yield

    sleep 暂停当前线程,允许低优先级线程获得执行机会,但并不释放对象的锁,进入不可运行状态 yield 类似sleep,但只允许同优先级有获得执行机会,同样也不会释放锁,当前线程仍是可运行状态,因此 ...

  7. 解决 warning I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

    只需要加载如下代码: import os os.environ['

  8. @ResponseBody ResponseEntity

    1.产生疑问 我们知道,如果在 Controller 的某个方法上加上 @ResponseBody 注解,那么你就能拿到 json 数据. 如果你只是知道这么用,那么你应该知道 ResponseBod ...

  9. Python博客目录

    python基础 1.helloworld 2.运算符&while循环 3.pycharm安装&for循环&format字符串&list列表&set集合使用 4 ...

  10. MPLS的模拟学习过程

    1.场景拓扑 使用小凡模拟器搭建了如下网络拓扑,使用的镜像为:c3640-jk9o3s-mz.122-15.T9.bin 相关的配置在下方 如果重复实验,需要清空设备的配置,知道路由器的密码,操作步骤 ...