当前位置:网站首页>有趣的 Kotlin 0x0A:Fun with composition
有趣的 Kotlin 0x0A:Fun with composition
2022-07-28 15:42:00 【AndroidKt】
最近在 http://portal.kotlin-academy.com/#/ 上看到很多关于 Kotlin 的有趣的题目。个人觉得很适合 Kotlin 爱好者,感兴趣的小伙伴可自行查阅。
【有趣的 Kotlin 】系列记录自己对每一题的理解。
0x0A:Fun with composition
val increment = {
i: Int -> i + 1 }
val bicrement = {
i: Int -> i + 2 }
val double = {
i: Int -> i * 2 }
val one = {
1 }
infix fun <T, R> (() -> T).then(another: (T) -> R) = {
another(this()) }
operator fun <T, R1, R2> ((T) -> R1).plus(another: (T) -> R2) = {
x: T -> this(x) to another(x) }
fun main(args: Array<String>) {
val equilibrum = one then double then (increment + bicrement)
print(equilibrum())
}
以上代码,运行结果是什么?可选项:
- Nothing, it doesn’t compile
- 5
- (1,2)
- (3,4)
思考一下,记录下你心中的答案。
分析
先看看变量
题目开头定义 4 个变量,皆为 函数类型和 Lambda 表达式。

函数用途:
- increment:加 1
- bicrement:加 2
- double:加倍
- one:调用后返回数值 1
再看看函数
4 个变量后,紧跟 2 个函数,一个是中缀函数,一个是操作符重载函数。
then:串联两个函数。先执行receiver,结果作为参数传入another。plus:合并两个函数的结果。执行receiver,执行another,并将两个结果组成Pair。
中缀函数 then

then 函数是一个中缀函数,同时也是一个泛型函数,持有 T, R 两种泛型类型
receiver:
() -> T。参数:
(T) -> R。返回值:
() -> R。
使用 infix 修饰的函数为 中缀函数,必须满足三个条件:
- 必须是成员函数或扩展函数。
- 必须有唯一的函数参数。
- 参数不可为可变数量的参数 (vararg ),并且不能有默认值。
infix fun Int.shl(x: Int): Int {
... }
// calling the function using the infix notation
1 shl 2
// is the same as
1.shl(2)
操作符重载函数 plus

plus 是一个操作符重载函数,同时也是一个泛型函数,持有 T, R1,R2 三种泛型类型。
receiver:
(T) -> R1。参数:
(T) -> R2。返回值:
(T) -> Pair<R1, R2>。
最后看主逻辑
fun main(args: Array<String>) {
val equilibrum = one then double then (increment + bicrement)
println(equilibrum())
}
代码逻辑还原一下

所以,最后 println(equilibrum()) 执行函数类型变量equilibrum 调用逻辑,并打印结果。
Pair 类型的 toString() 方法 public override fun toString(): String = "($first, $second)"。
所以,正确答案为 :
选项 4 :(3,4)
总结
语法糖的魅力在于用简洁的代码表达丰富的逻辑。但是反向思考一下,也有可能使逻辑变得晦涩难懂。
所以,日常开发中,选用合适的变量名和函数尤为重要。题中变量名和函数名使用很恰当,1 先加倍,再分别加 1,加 2,最后用 + 代表组合。
val equilibrum = one then double then (increment + bicrement)
边栏推荐
- Multiple commands produce ‘.../xxx.app/Assets.car‘问题
- laravel
- asp.net大文件分块上传断点续传demo
- Sort 2 bubble sort and quick sort (recursive and non recursive explanation)
- PHP about problems such as memory overflow timeout caused by large amount of data exporting or traversing data
- PHP图片合成技术
- HM secondary development - data names and its use
- Thoughts on solving the pop-up of malicious computer advertisements
- 栈的介绍与实现(详解)
- ANSA二次开发 - 界面开发工具介绍
猜你喜欢

Headline article_ signature

一大早支付宝来短信说你中“奖”了?处理服务器挖矿病毒 - kthreaddi

LeetCode每日一练 —— 剑指Offer 56 数组中数字出现的次数

每一个账号对应所有密码,再每一个密码对应所有账号暴力破解代码怎么写?...

Ansa secondary development - apps and ansa plug-in management

疫情红利消失,「居家健身」泡沫消散

ANSA二次开发 - 在PyCharm上搭建ANSA/META二次开发环境

Leetcode daily practice - 160. Cross linked list

LeetCode-学会对无序链表进行插入排序(详解)

Thoughts on solving the pop-up of malicious computer advertisements
随机推荐
Each account corresponds to all passwords, and then each password corresponds to all accounts. How to write the brute force cracking code
Baidu editor ueeditor, when editing too much content, the toolbar is not visible, which is not convenient for editing or uploading problems
"Wei Lai Cup" 2022 Niuke summer multi school training camp 3 a.ancestor lca+ violence count
Redis source code optimization -- binding core
Thoughts on solving the pop-up of malicious computer advertisements
[pointer internal skill cultivation] character pointer + pointer array + array pointer + pointer parameter (I)
SCI scientific paper writing Growth Camp (full version)
LeetCode每日一练 —— 160. 相交链表
关于MIT6.828_HW9_barriers xv6 homework9的一些问题
Kubeedge releases white paper on cloud native edge computing threat model and security protection technology
ANSA二次开发 - 在PyCharm上搭建ANSA/META二次开发环境
百度编辑器ueditor,编辑内容过多时,工具栏不可见,不方便编辑或上传问题
Pop up layer prompt in the background
IM即时通讯软件开发网络请求成功率的优化
Early in the morning, pay Bora SMS to say that you won the "prize"? Dealing with server mining virus - kthreaddi
优化Hypermesh脚本性能的几点建议
Detailed explanation of QT qstring
【指针内功修炼】字符指针 + 指针数组 + 数组指针 + 指针参数(一)
PHP图片合成技术
LeetCode-学会复杂带随机指针链表的题(详解)