有点晕,inline, crossinline,noinline小计

inline 主要用于展开铺平函数,用于高频访问但是代码不是很多的方法,减少函数对象的定义

fun <T> List<T>.normalForeach(action:(T)->Unit){for(item in this){action(item)}
}inline fun <T> List<T>.inlinedForeach(action: (T) -> Unit){for(item in this){action(item)}
}

inline就好像把函数内部的代码拷贝一份到调用的地方,减少了函数对象的中间产生。

带来的变化是,可以非本地的返回

fun main(){val list = (1..100).toList()list.normalForeach { println(it)return@normalForeach}list.inlinedForeach { println(it)return}}

普通的函数只能返回 return@normalForeach

内敛函数,因为相当于被拷贝过来了,可以直接返回到main,

另外内敛带来的变化还有

fun main(){val list = (1..100).toList()CoroutineScope(Dispatchers.Default).launch {delay(1000)list.normalForeach {println(it)delay(1000) //错误!非内敛,无scope环境return@normalForeach}list.inlinedForeach {println(it)delay(1000)return@launch}}
}

我们启动了一个协程,但是在normalForeach的lambda中无法使用delay,因为这里其实是一个函数对象,会指向到另外一个函数方法,没有协程的上下文环境,但是内敛函数就不一样了,他相当于是把lambda中的内容拷贝平铺过来了,所以,在inlinedForeach中可以使用协程的上下文环境,delay可以执行。

但是当一个函数被声明为内敛函数的时候,只能直接的运行函数参数,或者在另外一个内敛函数中运行函数参数,

inline fun <T> List<T>.inlinedForeach(action: (T) -> Unit){for(item in this){action(item) //直接运行方法参数kotlin.run {action(item) //或者在另外一个内敛函数中运行}Thread{action(item) //报错!不可以跨scope或者context}}
}

那如果我们必须要参数中的函数可以切换调用呢?

那我们需要在函数参数上crossinline关键字,允许函数被跨上下文调用

inline fun <T> List<T>.inlinedForeach(crossinline action: (T) -> Unit){for(item in this){action(item) //直接运行方法参数kotlin.run {action(item) //或者在另外一个内敛函数中运行}Thread{action(item) //因为crossinline关键字,不报错了}}
}

这样,就可以在Thread中调用action了,但是因为函数参数被声明了crossinlne,原本的非本地返回就不可以用了

所以要不要非本地返回和跨上下文调用,只能二选一

另外,当把一个函数声明为inline的时候,他的lambda参数也是inline的,所以无法通过函数地址引用的方式来调用

但是我们需要再inline声明的函数参数中,通过地址的方式来引用的话,就要noinline来声明


inline fun <T> List<T>.inlinedForeach(crossinline action: (T) -> Unit,noinline onError: (Exception) -> Unit
) {try {for (item in this) {action(item) //直接运行方法参数kotlin.run {action(item) //或者在另外一个内敛函数中运行}Thread {action(item) //因为crossinline关键字,不报错了}}} catch (e: Exception) {e.printStackTrace()handleError(e,onError)}}fun handleError(exception: java.lang.Exception,onError: (Exception) -> Unit) {println("handle ")onError(exception)}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558081.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

wildcard使用教程,解决绝大多数普通人的海外支付难题

许多人可能已经注意到,国外的一些先进AI工具对国内用户并不开放。而想要使用这些工具,我们通常会面临两个主要障碍:一是网络访问的限制,二是支付问题。网络问题很容易解决&#xff0c;难的是如何解决在国内充值海外软件。 今天给大家推荐一个工具——wildcard&#xff0c;用它…

MISC - 第13天(python脚本 重命名文件,拼接二维码,cloacked-pixel工具,中文电码,五笔编码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识 [安洵杯 2019]吹着贝斯扫二维码 附件信息: 使用APCHPR暴力破解工具&#xff0c;flag.zip 破解失败可能线索在其他文件&#xff0c;放到hxd查看 在hxd中&#xff0c;发现该文件头JFIF 是j…

HUAWEI_HCIA_实验指南_Lib1.4_配置通过Telnet登录系统

一、原理概述 Telnet(Telecommunication Network Protocol)起源于ARPANET,是最早的Internet应用之一。 Telnet 通常用在远程登录应用中&#xff0c;以便对本地或远端运行的网络设备进行配置、监控和维护。如网络中有多台设备需要配置和管理&#xff0c;用户无需为每一台设备…

多模态方法总结

多模态方法总结 架构分为Transformer Encoder的方法和基于Transformer Encoder和Decoder的方法 Transfomer Encoder方法 这张图来源于VILT&#xff0c;基本概括了多模态领域的模型架构。 图a是VSE或VSE的架构&#xff0c;文本端进行一个轻量的word embedding&#xff0c;视觉…

交易所开发:构建安全、高效、可靠的数字资产交易平台

数字资产交易平台是加密市场中连接用户与数字货币的重要枢纽。开发一个安全、高效、可靠的交易所&#xff0c;不仅需要综合考虑技术架构、安全策略、用户体验等方面&#xff0c;还需严格遵循法规要求以确保合规性。本文总结了交易所开发的关键要素&#xff0c;包括其类型、核心…

C++ static静态

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 用 static 修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成…

如何让 Raft 更稳健,使用 Pre-vote

本文参考文献 《Consensus: Bridging Theory and Practice》 1. Provote 解析原文 该算法解决的是某台机器被隔离后&#xff0c;再次加入时出现的扰动其他机器的问题。 1. 防止服务器重新加入集群时引发的中断 Raft领导者选举算法的一个缺点是&#xff0c;当一台已从集群中…

医疗工具实例分割系统源码&数据集分享

医疗工具实例分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DySnakeConv&#xff06;yolov8-seg-goldyolo等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

JS设计模式之策略模式:灵活、可扩展的编程利器

一. 前言 在 JavaScript 前端开发中&#xff0c;随着代码规模的增长和项目的复杂性&#xff0c;我们常常需要处理各种不同的条件和情况&#xff0c;而这可能导致代码变得冗长、难以维护。这时&#xff0c;我们就需要一种强大而灵活的编程模式来应对这些复杂的逻辑&#xff0c;…

【记录】PPT|PPT 箭头相交怎么跨过

众所周知&#xff0c;在PPT中实现“跨线”效果并非直接可行&#xff0c;这一功能仅存在于Visio中。然而&#xff0c;通过一些巧妙的方法&#xff0c;我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法&#xff0c;而本文将介绍一种改进…

如何自制无人机?

自制无人机是一个既有趣又富有挑战性的项目&#xff0c;它涉及到电子工程、机械工程和航空航天工程等多个领域的知识。以下是一个基本的自制无人机制作步骤和所需材料概览&#xff0c;供您参考&#xff1a; 一、准备阶段 1. 明确目标 - 确定无人机的用途&#xff08;如航拍、…

递归 回溯算法详解

递归 深搜 回溯 什么是回溯算法题目一&#xff1a; 全排列1. 题⽬链接&#xff1a;2. 题⽬描述&#xff1a;3. 解法&#xff1a;算法思路&#xff1a;递归流程如下&#xff1a; 4.代码 题目二&#xff1a;⼦集1. 题⽬链接&#xff1a;2. 题目描述&#xff1a;3. 解法&#xff1…

宠物咖啡馆数字化转型:SpringBoot框架的实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

【中间件】—一篇说明白API网关常用API网关推荐

【中间件】- API网关简介 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 文章目录 【中间件】- API网关简介1 计算…

机器学习K近邻算法——回归问题K近邻算法示例

针对“数据4.1”&#xff0c;讲解回归问题的K近邻算法&#xff0c;以V1&#xff08;营业利润水平&#xff09;为响应变量&#xff0c;以V2&#xff08;固定资产投资&#xff09;、V3&#xff08;平均职工人数&#xff09;、V4&#xff08;研究开发支出&#xff09;为特征变量。…

[Python学习日记-41] Python 中的列表生成式

[Python学习日记-41] Python 中的列表生成式 简介 什么是列表生成式 简介 列表是编程当中最为常用的一种数据类型&#xff0c;同时我们也会经常操作&#xff08;增删改查&#xff09;里面的数据&#xff0c;有的时候我们会需要大批量的修改所有列表当中的数据&#xff0c;本篇…

你会写SCI学术论文吗?

撰写SCI学术论文是许多科研工作者和研究生的必经之路。然而&#xff0c;对于许多新手来说&#xff0c;这可能是一个既复杂又令人望而生畏的任务。本文将为你提供一些实用的建议和步骤&#xff0c;帮助你更高效地完成SCI论文的写作。 1. 先中间后两头&#xff1a;摘要和结论最…

CCF开源发展委员会主任王怀民院士参与世界计算大会“开源生态构建数字未来”主题研讨并做重要报告...

点击蓝字 关注我们 CCF Opensource Development Committee 2024年9月25日上午&#xff0c;作为2024世界计算大会论坛之一的“开源生态构建数字未来”主题研讨在长沙召开。本次论坛由长沙先进技术研究院承办&#xff0c;由中国开源软件推进联盟、CCF YOCSEF长沙、湖南先进技术研…

自动驾驶系列—超声波雷达技术详解:自动驾驶中的短距离感知利器

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

无人机之飞行算法篇

无人机的飞行算法是一个复杂而精细的系统&#xff0c;它涵盖了多个关键技术和算法&#xff0c;以确保无人机能够稳定、准确地执行飞行任务。 一、位置估计 无人机在空中飞行过程中需要实时获取其位置信息&#xff0c;以便进行路径规划和控制。这通常通过以下传感器实现&#…