全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Kotlin基础教程之Run,标签Label,函数Function-Type

Kotlin基础教程之Run,标签Label,函数Function-Type

在Java中可以使用{}建立一个匿名的代码块,代码块会被正常的执行,除了改变了作用域之外,似乎并没有什么其他的作用。然而在Kotlin中却不能这么做,这是为什么呢?

其实,我们都知道一个函数一定与一个内存地址相关,而一个匿名的代码块其实也相当于是一个匿名的函数。在Kotlin中一般使用run函数来运行一段匿名代码块。

如下:

在Kotlin中使用标识符后跟@符号来定义一个标签,使用@后跟标识符来引用一个标签,run函数的语法初看起来似有一些怪异,其实run函数以一个函数作为参数,而一个匿名的代码块就可以是一个匿名函数,当我们在IntelliJ IDEA中把鼠标光标放到匿名代码块的大括号上时,会显示出匿名代码块对应的函数签名

local final fun <anonymous> ():Int defined in com.kotlin_learn.control_flow.fun_run

如图:

local代表作用域,定义在函数内部,作用域仅为local,final代表不可变,<anonymous>即为匿名,()是参数列表,Int是返回值,com.kotlin_learn.control_flow.fun_run是函数定义位置的完整路径。

由此可见,run函数的参数,那段匿名代码块被编译器转换为了一个匿名函数是毫无疑问的。

当然run函数是可以有返回值的,所以匿名代码块也可以是有返回值的匿名函数。

每一个函数都与一个或多个地址相对应,而每一个标签Label也是与一个或多个地址相对应,所以函数本身即是标签。

所以可以使用return@run之类的语法。

匿名函数虽然没有函数名,然而我们可以定义一个具名标签来代表这个函数,于是可以使用return@outer 2将2返回给i。

也许有人会有疑问,为什么不直接使用return 2呢,原因是return 将会从fun_run函数返回,而不是从匿名函数返回。

关于return和函数嵌套定义的问题下面还会说。

这段代码的运行结果如下:

接下来说一说forEach函数,与其他语言中不同,在Kotlin中forEach并不是一种语法,而是一类函数,forEach是iterator的函数,任何实现了iterator的类都可以使用forEach。forEach函数的参数也是一个函数,其参数是一个模板函数,可以是具名函数,匿名函数,lambda。forEach会对iterator迭代的每一个元素都调用一次传入的函数。

之所以讲到forEach,是为了熟悉标签的用法和return的用法。

如下:

别忘了infix function call。

运行结果如下:

接下来说一说function type,讨论一下函数。

对程序员来说,函数是很熟悉的,然而我们对函数就真的那么熟悉么?

函数也可以是类型,可以是变量,甚至常量。

如下:

在这段代码中我们定义了几个函数类型的变量和常量,并且在之间进行赋值等操作,其实和C++中的函数指针很相似,但是也有独特的地方。比如嵌套函数定义,函数标签的引用以及带标签的返回值等等。我们也看到了在一个匿名函数(end1代表的那个)中如何使用lambda表达式定义函数的参数列表和自动判断的返回类型。

这段代码运行结果如下:

刚才我们提到了函数嵌套定义,这是一个需要小心的地方。

看如下的代码:

从Java/C++一系出身的程序员(比如我:))很容易把这里的嵌套函数定义看成是匿名代码块的嵌套,以为程序会从外往内执行。从Pascal/PL一系出身的程序员就不会有这种问题,千万记住,函数虽然可以嵌套定义,但是如果没有调用是不会从外向内执行的。

所以输出很简单:

我们也看到了return的用法,这里的f1,f2,f3虽然是内部定义的函数,但是依然可以作为标签使用。

可见Kotlin是一种集大成的语言,甚至借鉴了古老的unix脚本和Pascal的语法,借鉴了很多语言的特性,再加上强大的编译器(Kotlin编译器会帮你做很多东西,远比其他语言做的多得多),使Kotlin的代码非常简洁优雅而且编程相当灵活高效。

在Kotlin中,太多的功能都是通过使用函数作为参数来实现,有的已经不能叫做语法,然而函数嵌套,infix function call,lambda,函数参数,可变参数列表,灵活的标签,强大的return,自动类型判断,Range,iterator,操作符重载,省略,模板...这些太多的功能,导致Kotlin的语法眼花缭乱,虽然有时看起来很优雅,但是也可能给人阅读代码带来巨大的困难。

最后以一段没什么用的代码结束本篇。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Kotlin 教程  # 标签Label  # 函数Function-Type  # 是一个  # 可以使用  # 这段  # 返回值  # 太多  # 多个  # 一个函数  # 也看  # 相对应  # 说一说  # 都是  # 这是  # 有什么  # 几个  # 也有  # 是一种  # 会有  # 是有  # 鼠标  # 将会 


相关文章: 如何在万网自助建站中设置域名及备案?  建站主机系统SEO优化与智能配置核心关键词操作指南  nginx修改上传文件大小限制的方法  学校免费自助建站系统:智能生成+拖拽设计+多端适配  常州企业网站制作公司,全国继续教育网怎么登录?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何通过远程VPS快速搭建个人网站?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  详解jQuery中基本的动画方法  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星代理费用多少?最新价格详情介绍  如何在建站宝盒中设置产品搜索功能?  成都网站制作报价公司,成都工业用气开户费用?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  建站之星安装路径如何正确选择及配置?  湖北网站制作公司有哪些,湖北清能集团官网?  建站之星后台密码遗忘或太弱?如何重置与强化?  制作网站公司那家好,网络公司是做什么的?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  ,如何利用word制作宣传手册?  python的本地网站制作,如何创建本地站点?  如何访问已购建站主机并解决登录问题?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星伪静态规则如何设置?  如何通过建站之星自助学习解决操作问题?  专业公司网站制作公司,用什么语言做企业网站比较好?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  平台云上自主建站:模板化设计与智能工具打造高效网站  已有域名如何免费搭建网站?  Thinkphp 中 distinct 的用法解析  深圳网站制作的公司有哪些,dido官方网站?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  建站之星导航配置指南:自助建站与SEO优化全解析  建站之星如何通过成品分离优化网站效率?  平台云上自助建站如何快速打造专业网站?  内部网站制作流程,如何建立公司内部网站?  建站之星如何实现PC+手机+微信网站五合一建站?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  网站图片在线制作软件,怎么在图片上做链接?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何在阿里云虚拟服务器快速搭建网站?  建站VPS选购需注意哪些关键参数?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何在IIS中新建站点并配置端口与IP地址?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。