当前位置: 首页 > news >正文

[dart学习]第四篇:函数

 

接着学习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=7, int b}) 
{
  return a+b;
}
main() {
  var c=testFunc(b:2);
  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 [1, 2, 3], 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 = [1, 2, 3];
  // Pass printElement as a parameter.
  list.forEach(printElement);  
}

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

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

 

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

 

转载于:https://www.cnblogs.com/gklovexixi/p/10741352.html

相关文章:

  • C# 查看IL代码
  • MySQL事务锁问题-Lock wait timeout exceeded
  • .Net Memory Profiler的使用举例
  • node_js学习笔记 03(require module exports)...
  • 为什么不能单独修改unity transform的position的x
  • unity性能测试工具——待完成
  • 修改linux的默认语言
  • unity的优化知识点
  • juypter4.4.0 自动补全
  • unity Job System
  • unity Gpu Instance
  • 通过配置JVM参数解决生成日志存在乱码问题
  • unity Graphics的一些方法介绍
  • CodeForces 1151B Dima and a Bad XOR
  • unity Stopwatch
  • Akka系列(七):Actor持久化之Akka persistence
  • canvas 高仿 Apple Watch 表盘
  • CentOS从零开始部署Nodejs项目
  • download使用浅析
  • Javascript弹出层-初探
  • java正则表式的使用
  • Laravel Mix运行时关于es2015报错解决方案
  • sublime配置文件
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • uva 10370 Above Average
  • vue-cli3搭建项目
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从0到1:PostCSS 插件开发最佳实践
  • 电商搜索引擎的架构设计和性能优化
  • 给Prometheus造假数据的方法
  • 两列自适应布局方案整理
  • 聊一聊前端的监控
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 容器镜像
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​linux启动进程的方式
  • ###C语言程序设计-----C语言学习(3)#
  • #大学#套接字
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)虚拟机的安装与使用,linux系统安装
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (第27天)Oracle 数据泵转换分区表
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)memcache、redis缓存
  • (转)德国人的记事本
  • *上位机的定义
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .java 9 找不到符号_java找不到符号