程序进化论:一行表达式 Single-expression functions

「学姐,你今天发生什麽事了吗?」
「嗯⋯⋯」唯心没有马上回应诗忆的问题。

「是不是太累了?其实剩下的可以读课堂讲义的,真的,我现在就有在读。」
「⋯⋯其实是在烦恼要不要教你真正的程序。」

「咳咳咳⋯⋯我们之前写的是假的吗?!」一句话达到语不惊人死不休的效果,诗忆觉得学姐完美达成,她呛到了。

「当然是真的呀。」唯心看着这样的诗忆笑起来。「只是啊,程序语言一直在朝着降低开发者门槛的进化,且累绩前人经验的各种框架和函式库也越来越多,需要理解演算法和资料结构才能写的程序越来越少。当然,掌握这两者的工程师能走得更远,这是毋庸置疑地。」比如Google、Facebook、Microsoft和Amazon等需要大数据分析的公司,希望工程师能开发更好的演算法。

「比如说,猜数字几A几B这个游戏,出题方需要先准备一个四位数,且数字之间不能重复。你会怎麽做?」唯心考验诗忆。

「嗯?我想想,用for回圈跑四次,里面的内容是产生0到9的数字,然後还要检查有没有和之前产生的重复?」诗忆边思考边说。

「是呀,检查有没有重复这件事,其实就是搜寻资料的功能。而资料结构和演算法在其中的角色分别是,前者决定资料在储存记忆体的方式,後者估算占据的记忆体容量和花费的时间。」

「听起来很重要呢。」

「但是,你知道吗?Kotlin的基本函式库有一个shuffled函式,功能就是打乱阵列内容。所以只要准备0到9的阵列,打乱之後取前面四个数字,就完成出题方的准备工作。」唯心把之前写好的程序码拿出来。「不过,这也是在阵列大小和索取的数量级相差不多的情形下才用的取巧方法。」

fun main() {
    println(random4in9())
}
fun random4in9() = (0..9).shuffled().take(4)

诗忆看着函式右边没有大括号包着,只有等号的写法,说:「喔喔,我有在讲义上看过这种函式写法,叫做一行表达式Single-expression functions对吧?」

「对,之前我们用的都是叙述式Statement,新写法可以不用注明回传的类别。」

「我在讲义上还看到变数也可以存函式。」诗忆把刚写好的程序码拿给唯心学姐看。

fun main() {
    println(random4in9)
}
val random4in9 = (0..9).shuffled().take(4)

「嗯⋯⋯是这样没错,但是变数写法只会在程序开始时呼叫一次函式,程序执行期间都直接延用过去的结果,你试着执行一次就知道了。」唯心将两个写法各呼叫两次。

fun main() {
    println(random4in9())
    println(random4in9())
    println(random4in9)
    println(random4in9)
}

列印出的结果是:

[6, 4, 2, 1]
[0, 6, 5, 2]
[4, 3, 5, 2]
[4, 3, 5, 2]

「嗯嗯,原来如此,关於学姐方才说的,是不是要学真正的程序这件事,先不论未来要去哪里就业,演算法和资料结构都是系上必修,在毕业前拿到及格分数就好,所以还有很多时间呀。」诗忆笑着说道。

「说的也是呢,得先平安度过这次的期末考呢。」唯心对着诗忆眨了眨眼,轻轻地笑了。


<<:  Day 6:监控系统的设计

>>:  轻松小单元 - 如何分配角色

Day9 React生命周期

React Component的生命周期,大致上可以分成产生、更新及结束三个阶段,每个阶段都有对应的...

[Day12] 学 Reactstrap 就离 React 更近了 ~ Component 的引入&使用

前言 本来今天文章就打算介绍很常使用的 Navbar, 但发现这样难度又一下子跳上去了, (因为会牵...

Day 14 - Grid 排版

如果上一篇威尔猪讲的 Flex 是十字形排版法,那今天讲的 Grid 就属於棋盘格排版法。它比 F...

Day1 Open-Match 简介

在众多游戏类型中,对战游戏类型游戏占有很重要的一席之地。不论是手机游戏市场,还是以电脑为主的竞技游戏...

Day12 NiFi - Reporting Task & Bulletin Board

今天来带大家了解一下 NiFi 原生的 Monitoring 是怎麽运作的,像是 Disk, Mem...