【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返回2
  var add2 = makeAdder(2);

  //创建一个函数add4,add4返回4
  var add4 = makeAdder(4);

  //add2返回2+3
  assert(add2(3) == 5);
  //add4返回4+3
  assert(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

时间: 06-12

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

MySQL学习笔记-自定义函数

MySQL学习笔记-自定义函数 1.自定义函数简介 自定义函数:用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同 自定义函数的两个必要条件:(1)参数  (2)返回值 自定义函数: 创建自定义函数 CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body 关于函数体: 1.函数体可以由合法的SQL语句构成: 2.函数体可以是

javascript学习3-自定义函数

javascript自定义函数,很简单的小例子. 实现效果:输入两个数和运算符号,根据不同运算符对数据进行计算,返回值 代码: 1 <html> 2 <head> 3 <script type="text/javascript"> 4 var num1=window.prompt('请输入第一个num'); 5 var num2=window.prompt('请输入第二个num'); 6 var operator=window.prompt('请输入

和demopu一起学习javascript ( concat函数 )

和demopu一起学习javascript (  concat函数 ) 定义和用法 concat方法可以把两个或者多个数组连接起来,组成一个新的数组. 语法 concat(array1,array2,......,arrayN) 参数 描述 array1 必需.该参数可以是具体的值,也可以是数组对象.可以是任意多个. 例子 1 var arr = ["George","John","Thomas"]; var arr2 = ["Jame

[Go语言]从Docker源码学习Go——main函数

Go程序从main包下的main函数开始执行,当main执行结束后,程序退出. Docker的main函数在 docker/docker/docker.go package main //Import needed packages; import ( ... "github.com/docker/docker/api" ... ) //define const; const ( defaultCaFile = "ca.pem" defaultKeyFile = &

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

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

PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:    常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:    下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < 小于 > 大于 <= 小于或等于 >= 大于或等于 = 等于 != 不等于 比较操作符可以用于所有可以比较的数据类型.所有比较操作符都是双目操作符,且返回boolean类型.除了比较操作符以外,我们还可以使用BETWEEN语句,如

OpenCV for Python 学习 (一 绘图函数)

本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到): cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) cv2.circle(img, center,

C和指针 学习笔记-4.函数

参数传递: 参数传递采用按值传递 ADT&黑盒 ADT:abstract data type,抽象数据类型 c可以用于设计与实现抽象数据类型,因为它可以限制函数和数据定义的作用域,这种技巧也称为黑盒设计 user.h #define MAXLEN 3 struct UserClz { char *name; char *phone; char *address; }; typedef struct UserClz User; /* *接函数 *通地名称查找地址 */ char const * l

day8_python学习笔记_chapter11_函数

1. 返回对象的数目   python实际返回的对象 0 -> None ; 1 -> object ; >1 -> tuple 2. 内部/内嵌函数:如果内部函数的定义包含了再外部函数里定义的对象的引用, 内部函数会变成被称为闭包的特别之物. 3. 装饰器 day8_python学习笔记_chapter11_函数,布布扣,bubuko.com

Python快速学习09: 函数的参数

前言 系列文章:[传送门] 继续干起来!! 正文 我们已经接触过函数,函数是可以被引用的(访问或者以其他变量作为其别名),也作为参数传入函数,以及作为列表和字典等等容器对象的元素(function)的参数(arguments)传递. 传递函数 形式参数       位置参数 默认参数 关键字变量参数 位置传递 例子: def f(a,b,c): return a+b+c print(f(1,2,3)) #在调用f时,1,2,3根据位置分别传递给了a,b,c. 形式参数 关键字传递 用位置传递会感