当前位置:网站首页>有趣的 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)
边栏推荐
- 百度编辑器ueditor,编辑内容过多时,工具栏不可见,不方便编辑或上传问题
- The video Number finds the golden key, and Tiktok imitates the latecomers
- Abaqus GUI界面解决中文乱码问题(插件中文乱码也适用)
- Qt学习之信号和槽机制
- ANSA二次开发 - Visual Studio Code上搭建ANSA二次开发环境
- 500million users, four years earlier than wechat... This app, which has been in operation for 15 years, will be permanently discontinued
- Detailed explanation of QT qstring
- 微信公众号获取素材列表
- 在abaqus中使用PyQt设计GUI
- ANSA二次开发 - Apps和ANSA插件管理
猜你喜欢

ANSYS secondary development - MFC interface calls ADPL file

加速投资的小红书,“病急乱投医”?

关于web对接针式打印机问题,Lodop使用

LeetCode每日一练 —— 160. 相交链表

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

在vs code上配置Hypermesh二次开发环境

Leetcode daily practice - the number of digits in the offer 56 array of the sword finger

c语言编程当中两个!!的作用

排序4-堆排序与海量TopK问题

The little red book of accelerating investment, "rush to medical treatment"?
随机推荐
redis源码优化--绑核
Two of C language programming!! Role of
C language exception handling mechanism: jump function jump function setjmp/sigsetjmp and longjmp/siglongjmp
LeetCode-学会对无序链表进行插入排序(详解)
The video Number finds the golden key, and Tiktok imitates the latecomers
Sort 1-insert sort and Hill sort
Leetcode topic
laravel
PHP about problems such as memory overflow timeout caused by large amount of data exporting or traversing data
关于MIT6.828_HW9_barriers xv6 homework9的一些问题
Wechat official account to obtain material list
Design direction of daily development plan
解决电脑恶意广告弹窗的思路
Sort 5-count sort
IT远程运维是什么意思?远程运维软件哪个好?
Headline article_ signature
使用js直传oss阿里云存储文件,解决大文件上传服务器限制
日常开发方案设计指北
LwIP development | socket | TCP | client
资本「断供」两年,我只能把公司卖了