Kotlin函数使用综述与显式返回类型分析
位置参数与具名参数:
继续接着上一次https://www.cnblogs.com/webor2006/p/11498842.html的方法参数学习,再定义一个函数来说明具名参数的问题:

调用一下,先全部都指定参数肯定就会将默认值给替换掉了:


上面的这种方式其实是叫位置参数,接下来用具名的方式来指定参数:


下面再来看一个关于位置参数和具名参数的规则:“在调用函数时,如果同时使用了位置参数与具名参数,那么所有的位置参数都必须要位于第一个具名参数之前,比如说:foo(1, x=2)是允许的;而foo(x=1, 2)是不允许的。”
可变参数:
其实跟Java的类似,只是语法形式不太一样,下面看下代码:

输出结果:

这是跟Java一样的地方,而跟Java不一样的地方对于可变参数可以用一个数组传递过来,而在Kolin中如果想将数组传给可变参数就不行,如下:

看下报错信息:

这里其实需要分散运算符(spread operator)来指定,如下:


言外之意就是将数组里面的元素打散了,这样的话我们就可以将一个已经声明的数组做为可变参数进行传递了,如下:


但是有个特殊的情况需要注意:“在kotlin中调用Java方法时不能使用具名参数语法,因为Java字节码并不总是会保留方法参数名信息。”
函数定义:
对于Koltin中的函数定义其实学到这已经比较熟悉了,下面再来集中审视下它,先来定一个函数:

上面是定义了接收一个参数,不返回值的函数,其中不返回值时是可以将Unit进行省略的,如下:

其实该方法的完整写法应该是这样:

那么这个Unit是个啥东东呢?跟进去看一下它的定义:

下面再来看一个比较常有的函数定义:

显示返回类型:
先看下它的定义:“拥有方法体的函数必须要显示指定返回类型,除非函数返回Unit,这时返回类型就可以省略掉。Koltin并不会推断拥有块体的函数的返回类型,因为这种函数可能有非常复杂的控制流程,返回类型对于阅读代码的人来说就不是那么明显了。(有时,对于编译器来说亦如此)”,比如说我们上一个方法是可以省略方法返回类型,如下:

因为是一个很简单的表达式,比较容易推断方法的返回类型,但是如果将a + b写到方法体中就立马编译失败了:

看下提示:

此时就只能显示的指定方法的返回类型了:

所以需要注意这个小细节。
Kotlin函数使用综述与显式返回类型分析的更多相关文章
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
条款6:当auto推导出意外的类型时,使用显式的类型初始化语义 条款5解释了使用auto来声明变量比使用精确的类型声明多了了很多的技术优势,但有的时候,当你想要zag的时候,auto可能会推导出了zi ...
- item 5: 比起显式的类型声明,更偏爱auto
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...
- [Effective Modern C++] Item 6. Use the explicitly typed initializer idiom when auto deduces undesired types - 当推断意外类型时使用显式的类型初始化语句
条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> featu ...
- dll显式加载与隐式加载
使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...
- item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...
- c# implicit explicit关键字(隐式和显式数据类型转换)
implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_typ ...
- typedef 返回类型(*Function)(参数表) ——typedef函数指针
//首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...
- scala学习手记20 - 方法返回类型推断
除了推演变量的类型,scala也会推演方法的返回类型.不过这里有一处需要注意:方法返回类型的推演依赖于方法的定义方式.如果用等号"="定义方法,scala就会推演方法返回类型:否则 ...
- DLL中类的显式链接(用虚函数进行显式链接)
DLL的显式链接在某些时候比隐式链接具有更大的灵活性.比如,如果在运行时发现DLL无法找到,程序可以显示一个错误信息并能继续运行.当你想为你的程序提供插件服务时,显式链接也很有用处. 显式链接到全局C ...
随机推荐
- CMDBuild部署教程
一.CMDBuild简介 CMDBuild是一个通过Web界面配置的CMDB系统.可以通过Web界面来进行建模.创建资产数据库,并处理相关的工作流程.CMDBuild可用于集中管理数据库模块和外部应用 ...
- Windows删除文件夹下的指定格式文件(递归删除)
问题描述: 今天遇到一个需求,需要对文件夹进行文件筛选.目录结构较为复杂(目录较多,层次较深),数据量较大(总共60GB左右). 鉴于上述情况,直接排除了人工处理方式(否则小伙伴们会打死我的). 解决 ...
- python3.5+tornado学习
python3.5的安装 python官网下载地址:https://www.python.org/ 自行下载最新版本 下载pip包或者easy_install 后缀为.gz格式 地址:https:// ...
- 【笔试题】Overloading in Java
笔试题 Overloading in Java Question 1 以下程序的输出结果为( ). public class Test { public int getData() { return ...
- 类的练习2——python编程从入门到实践
9-7 管理员: 管理员是一种特殊的用户.编写一个名为Admin的类,并让它继承练习9-3或者9-5的User类.添加一个名为privileges的属性,用于存储一个由字符串(如"can a ...
- day23——继承
day23 初识继承 字面意思:儿子可以完全使用父亲的所有内容 专业角度:如果B类继承A类, B类就称为子类.派生类 A类就称为父类.基类.超类 面向对象三大特性:继承.封装.多态 继承:单继承.多继 ...
- SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near
报错如图: 最开始其实我的列名tname和tsubject分别叫name和subject,后来看到网上有说这个报错可能是数据库建表的时候使用了mysql的关键词,我就只把name改了.后来还是这个问题 ...
- STM32串口复用关系&printf重定义
串口复用 什么是普通功能输入输出?普通功能输入输出类似于:大厅<—>门<—>室外的关系,大厅只需要经过大门即可到室外,从室外经过门也可以到达大厅. 什么是复用工功能输入输出?复 ...
- Codeforces Round #426 (Div. 1) (ABCDE)
1. 833A The Meaningless Game 大意: 初始分数为$1$, 每轮选一个$k$, 赢的人乘$k^2$, 输的人乘$k$, 给定最终分数, 求判断是否成立. 判断一下$a\cdo ...
- 如何配置这个maven仓库的源http://mvnrepository.com/repos
http://mvnrepository.com/repos 主要是ID .mirrorof.name 怎么配置,这个网站上有spring5.0的,别的仓库没有,我需要这个源. 原文地址:https: ...