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();
  printDynamicParams(true);
}

控制台输出结果:

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

  • (1)var

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

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

    var a = ;
    a = "Test";
  • (2)Object

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

    它可以赋值为任何类型:

    object a = ;
    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());
  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 = '', 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", ''));
print(msg("Tiis is msg content")); print(msgTwo("This is msgTwo content", '', '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();
  print(testX.toString());   Test testY = new Test.Y();
  print(testY.toString());   Test testXY = new Test.XY(, );
  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返回2
  var add2 = makeAdder();   //创建一个函数add4,add4返回4
  var add4 = makeAdder();   //add2返回2+3
  assert(add2() == );
  //add4返回4+3
  assert(add4() == );
}

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);
}

【dart学习】-- Dart之函数的更多相关文章

  1. [dart学习]第四篇:函数和操作符(本篇未完待续)

    接着学习dart的函数和操作符. 1.函数Function dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参 ...

  2. 【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包

    一,匿名方法定义 (参数1,参数2,....){ 方法体... return 返回值 } 二,匿名方法特性 可赋值给变量,通过变量进行调用 可在其他方法中直接调用或传递给其他方法 void main( ...

  3. [dart学习]第二篇:dart变量介绍 (一)

    前言 本文的所有内容均是官方文档的简单翻译和理解,需要查看原文,请登录  https://www.dartlang.org/guides/language/language-tour  阅读, 让我们 ...

  4. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  5. Dart 学习资料

    Dart 学习资料: 学习资料 网址 Dart 编程语言中文网 http://dart.goodev.org/ Dart 官方包仓库 https://pub.dartlang.org/ 你想了解的Da ...

  6. [dart学习]第五篇:操作符

    前言:本系列内容假设读者有一定的编程基础,如了解C语言.python等. 本节一起来学习dart的操作符,直接拷贝官网的操作符描述表如下: Description Operator unary pos ...

  7. Dart学习笔记-运算符-条件表达式-类型转换

    Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...

  8. Dart语言学习( 一) 为什么学习Dart?

    为什么学习Dart? Google及全球的其他开发者,使用 Dart 开发了一系列高质量. 关键的 iOS.Android 和 web 应用. Dart 非常适合移动和 web 应用的开发. 高效 D ...

  9. Dart 学习

    语言特性 Dart所有的东西都是对象, 即使是数字numbers.函数function.null也都是对象,所有的对象都继承自Object类. Dart动态类型语言, 尽量给变量定义一个类型,会更安全 ...

随机推荐

  1. 【杂】聊聊我的男神:Jordan Peterson

    这篇文章我打算聊聊我的男神Jordan Peterson(简称JP).如果还不太了解JP,那么下面两个链接是JP的背景介绍: [文字]Jordan Peterson From Wikipedia, t ...

  2. 【leetcode】915. Partition Array into Disjoint Intervals

    题目如下: 解题思路:题目要求的是在数组中找到一个下标最小的index,使得index左边(包括自己)子序列的最大值小于或者等于右边序列的最小值.那么我们可以先把数组从最左边开始到数组最右边所有子序列 ...

  3. boost pointer container

    1. boost::ptr_vector #include <boost/ptr_container/ptr_vector.hpp> #include <iostream> i ...

  4. Nacos 常见问题及解决方法

    Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈.在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方法,这篇文章后续 ...

  5. 洛谷 P2441 角色属性树

    题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例 ...

  6. 剑指offer---3、按之字形顺序打印二叉树

    剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...

  7. thinkphp 连接多个数据库

    config配置文件 //数据库配置信息 'DB_CONFIG' => array( 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'loc ...

  8. HTML5: HTML5 表单属性

    ylbtech-HTML5: HTML5 表单属性 1.返回顶部 1. HTML5 表单属性 HTML5 新的表单属性 HTML5 的 <form> 和 <input>标签添加 ...

  9. 10.Jmeter 快速入门教程 -- 用Jmeter测试你的EJB

    有时候,需要对EJB进行性能基准测试,这对开发非常有帮助. 有很多种方法可以这么做, 当然我们这里介绍Apache's Jmeter 来进行实验测试. 非常不幸的是, Jmeter没有提供一个现成的测 ...

  10. scp指定端口 从远程机器复制目录到本机器目录

    scp -P 22622 -r root@192.168.70.63:/root/iNmon ./ -P port  注意是大写的P, port是指定数据传输用到的端口 root@192.168.70 ...