背景
一般在项目开发中,我们经常会在关键节点上埋点,而且埋点中会增加一些额外参数,这些参数通常是成对出现
且参数个数是不固定的
。如下:
//定义事件EVENT_ID
const val EVENT_ID = "event_xmkp"
//注意:这里传入的是vararg可变参数
fun String.log(vararg args: String) {
if (args.size % 2 > 0) {
throw RuntimeException("传入的参数必须是偶数")
}
if (args.isEmpty()) {
buryPoint(this)
} else {
//注意这里:可变参数在作为数组传递时需要使用伸展(spread)操作符(在数组前面加 *)
buryPoint(this, *args)
}
}
private fun buryPoint(eventId: String, vararg args: String) {
if (args.isNotEmpty()) {
Log.e(TAG, "buryPoint: $eventId, args: ${args.toList()}")
} else {
Log.e(TAG, "buryPoint: $eventId")
}
}
调用方式如下:
EVENT_ID.log()
EVENT_ID.log("name", "小马快跑")
EVENT_ID.log("name", "小马快跑", "city", "北京")
示例中可变参数可以是0个、2个、4个
,执行结果:
2022-11-22 19:00:54 E/TTT: eventID: event_xmkp
2022-11-22 19:00:54 E/TTT: eventID: event_xmkp, args: [name, 小马快跑]
2022-11-22 19:00:54 E/TTT: eventID: event_xmkp, args: [name, 小马快跑, city, 北京]
可以看到通过定义可变参数,在调用方可以灵活地传入0个
或多个
参数,下面就分析下Kotlin
方法中的可变参数。
注意:可变参数在作为数组传递时需要使用伸展操作符(在数组前面加 *),如果去掉 *号,编译器会报如下错:
Kotlin中使用可变参数
Java
中可变参数规则:
- 使用…表示可变参数
- 可变参数只能在参数列表的最后
- 可变参数在方法体中最终是以
数组
的形式访问
Kotlin
中可变参数规则:
- 不同于
Java
,在Kotlin
中如果vararg
可变参数不是列表中的最后一个参数, 可以使用具名参数语法传递其后的参数的值。 - 和
Java
一样,在函数内,可以以数组的形式使用这个可变参数的形参变量,而如果需要传递可变参数,需要在前面加上伸展(spread
)操作符(在数组前面加 *),第一节已给出示例。
对Kotlin可变参数反编译
对上一节中的String.log()
代码反编译成Java
代码:
//kt代码
fun String.log(vararg args: String) {
if (args.size % 2 > 0) {
throw RuntimeException("传入的参数必须是偶数")
}
if (args.isEmpty()) {
buryPoint(this)
} else {
//注意这里:可变参数在作为数组传递时需要使用伸展(spread)操作符(在数组前面加 *)
buryPoint(this, *args)
}
}
转换之后:
// Java代码
public final void log(@NotNull String $this$log, @NotNull String... args) {
...
if (args.length % 2 > 0) {
throw (Throwable)(new RuntimeException("传入的参数必须是偶数"));
} else {
if (args.length == 0) {
this.buryPoint($this$log);
} else {
this.buryPoint($this$log, (String[])Arrays.copyOf(args, args.length));
}
}
}
Kotlin
的vararg args: String
参数转换成Java的@NotNull String... args
Kotlin
的spread
伸展操作符*args
转换成Java
的(String[])Arrays.copyOf(args, args.length)
,可见最终还是通过系统拷贝生成了数组。
资料
【1】https://www.kotlincn.net/docs/reference/functions.html
文章来源于互联网:Kotlin | 使用vararg可变参数
阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/19805,转载请注明出处。
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/19805,转载请注明出处。
评论0