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

发布时间 - 2026-01-11 01:25:34    点击率:

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  # 是一个  # 可以使用  # 这段  # 返回值  # 太多  # 多个  # 一个函数  # 也看  # 相对应  # 说一说  # 都是  # 这是  # 有什么  # 几个  # 也有  # 是一种  # 会有  # 是有  # 鼠标  # 将会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在IIS中新建站点并解决端口绑定冲突?  详解Oracle修改字段类型方法总结  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  三星网站视频制作教程下载,三星w23网页如何全屏?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何用PHP快速搭建CMS系统?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel如何实现数据库事务?(DB Facade示例)  海南网站制作公司有哪些,海口网是哪家的?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何基于云服务器快速搭建网站及云盘系统?  如何利用DOS批处理实现定时关机操作详解  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何实现用户密码重置功能?(完整流程代码)  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  奇安信“盘古石”团队突破 iOS 26.1 提权  如何选择PHP开源工具快速搭建网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何升级到最新版本?(升级指南和步骤)  如何用AWS免费套餐快速搭建高效网站?  如何快速建站并高效导出源代码?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何选择可靠的免备案建站服务器?  如何用PHP快速搭建高效网站?分步指南  Mybatis 中的insertOrUpdate操作  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何快速打造个性化非模板自助建站?  制作电商网页,电商供应链怎么做?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  微信小程序 配置文件详细介绍  如何自定义建站之星网站的导航菜单样式?  Laravel如何实现本地化和多语言支持?(i18n教程)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  成都网站制作公司哪家好,四川省职工服务网是做什么用?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  做企业网站制作流程,企业网站制作基本流程有哪些?