【第二阶段】kotlin语言的内联-inline关键字

news/2024/11/7 22:48:16/

1.函数如果没有使用lambda作为参数,就不需要声明成内联
2.函数如果使用lambda作为参数,就需要声明成内联,如果不使用内联,在调用端会生成多个对象来完成lambda的调用,会造成性能的损耗
3.函数如果使用lambda作为参数,使用inline关键字声明为内联,相当于C++中的#define 宏定义,宏替换。会把函数直接替换到(main/调用处)没有任何函数开辟,对象开辟的损耗。
4.结论:如果函数有lambda参数,尽量使用内联inline关键字。这样内部会有优化,减少函数开辟,对象开辟的损耗。

/*** You can edit, run, and share this code.* play.kotlinlang.org*/
fun main() {//调用传参---第一种方式//普通参数传入即可,针对在调用函数中的参数函数传入使用匿名函数,匿名方法的返回值作为最终的打印结果://输入传参在调用该方法时传入即login方法中传入参数 responseResult("login success",200),,在主函数中使用匿名函数传入参数,并实现这个函数后输出最终的打印结果val info=login("kotlin","123456"){msg:String,code:Int->"登录结果:$msg,$code" //隐式返回}println(info)//调用传参---第二种方式//符合正常逻辑的传参格式:login(username:String,password:String,responseResult:(String,Int)->String):String),这里第三个参数也是实现提,val info2=login("kotlin","123456",{msg:String,code:Int->"登录结果:$msg,$code" //隐式返回})println(info2)//调用传参---第三种方式,类型推断的匿名函数val info3=login("kotlin","123456",responseResult={msg:String,code:Int->"登录结果:$msg,$code" //隐式返回})println(info3)
}//模拟数据库SQLServer
const val USER_NAME_DB="kotlin"
const val USER_PWD_DB="123456"//登录
/** responseResult:(String,Int)->Unit) 传入响应结果的参数,同时也是获取响应结果的函数* *  TODO()//Nothing类型,出现问题,终止程序** */
private inline fun login(username:String,password:String,responseResult:(String,Int)->String):String{if(username==null||password==null){TODO("账号密码为空")//Nothing类型,出现问题,终止程序}//登录校验if(username.length>3&&password.length>3){if(isLogin(username,password)){//登录成功逻辑,以及处理登录成功后的业务//登录成功后返回响应结果,调用参数中的responseResult:(String,Int)->Unit)return responseResult("login success",200)}else{//登录失败逻辑,以及处理登录失败后的业务//登录失败后返回响应结果,调用参数中的responseResult:(String,Int)->Unit)return responseResult("login failed",444)}}else{TODO("账号密码不符合规范")//Nothing类型,出现问题,终止程序}return ""
}//登录校验
private fun isLogin(username:String,password:String):Boolean{return if(username==USER_NAME_DB && password==USER_PWD_DB) true else false
}

执行结果
在这里插入图片描述

6.使用内联inline时,上面的函数不能使用在public类型的函数上,不然会报错:

Public-API inline function cannot access non-public-API 'private fun isLogin(username: String, password: String): Boolean defined in root package in file File.kt'

公有 API 内联函数的限制
当⼀个内联函数是 public 或 protected 而不是 private 或 internal 声明的⼀部分时,就会认为它是⼀个模块级的公有 API。可以在其他模块中调用它,并且也可以在调用处内联这样的调用。

这带来了⼀些由模块做这样变更时导致的⼆进制兼容的⻛险⸺声明⼀个内联函数但调用它的模块在它修改后并没有重新编译。(A 调用了内联函数B,然后B修改了,A的调用处是不会重新编译的)

为了消除这种由非公有 API 变更引⼊的不兼容的风险,公有 API 内联函数体内不允许使用非公有声明,即,不允许使用private 与 internal 声明以及其部件。

结论:使用内联的函数体内不允许使用private 与 internal 声明以及其部件
修改如下:改变函数体内方法为公有或者将内联函数修改为 private 或 internal
在这里插入图片描述

或者:
在这里插入图片描述


http://www.ppmy.cn/news/1027863.html

相关文章

项目实战 — 消息队列(8){网络通信设计①}

目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应 🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类 🎄 交换机 🎄 队列 &#x1f38…

2023河南萌新联赛第(五)场:郑州轻工业大学C-数位dp

链接:登录—专业IT笔试面试备考平台_牛客网 给定一个正整数 n,你可以对 n 进行任意次(包括零次)如下操作: 选择 n 上的某一数位,将其删去,剩下的左右部分合并。例如 123,你可以选择…

MATLAB 2023a的机器学习、深度学习

MATLAB 2023版的深度学习工具箱,提供了完整的工具链,使您能够在一个集成的环境中进行深度学习的建模、训练和部署。与Python相比,MATLAB的语法简洁、易于上手,无需繁琐的配置和安装,让您能够更快地实现深度学习的任务。…

【linux】2 软件管理器yum和编辑器vim

目录 1. linux软件包管理器yum 1.1 什么是软件包 1.2 关于rzsz 1.3 注意事项 1.4 查看软件包 1.5 如何安装、卸载软件 1.6 centos 7设置成国内yum源 2. linux开发工具-Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行…

FileZilla Server安装配置使用说明

作者:John 链接:https://www.zhihu.com/question/20577011/answer/2360828234 来源:知乎 第一步:右键点击”立即下载“ 第二步:服务器端点击,“windows平台”版本 第三步:这个安装最新的“Fi…

Django中级指南:理解并实现Django的模型和数据库迁移

Django 是一个极其强大的 Python Web 框架,它提供了许多工具和特性,能够帮助我们更快速、更便捷地构建 Web 应用。在本文中,我们将会关注 Django 中的模型(Models)和数据库迁移(Database Migrations&#x…

详细介绍如何对音乐信息进行检索和音频节拍跟踪

在本文中,我们将了解节拍的概念,以及我们在尝试跟踪节拍时面临的挑战。然后我们将介绍解决问题的方法以及业界最先进的解决方案。 介绍 音乐就在我们身边。每当我们听到任何与我们的心灵和思想相关的音乐时,我们就会迷失其中。我们下意识地随着听到的节拍而敲击。您一定已…

C++unique_ptr小结

文章目录 返回unique_ptr指定删除器尺寸问题 返回unique_ptr unique_ptr<string> test() {return unique_ptr<string>(new string("hello world"));// 我们知道在unique_ptr不能进行赋值, 或者使用其他的指针初始化, // 在这里创建了临时的对象, 所以会…