经过这段时间的思考, 我认为要理解一门编程语言应该从它最重要的"组件"--- 函数去入手,如果一个程序员不很好的明白如何使用函数的话, 往往他写出的代码就不是很清晰易懂。
换个视角理解"函数"
下面就让我们一起来看看这个在编程语言中最重要的组件吧, 函数共有三步组成,分别是:
- 参数列表 (list)
- 函数体 (body)
- 返回值 (return value)
现在我们可以做一个有趣的类比:
首先将函数的这三个部分打包成为一个"电路模块"(或者是某种电子器件的"样板"), 当你去给这个电路模块供电的时候, 你需要用一根"电线", 并将它连接到该电路模块中的电线端子, 我们将电路模块中的这根电线称之为"参数"。电线连接到电路模块的电线端子这一行为称之为"绑定"。
比如下面这段代码:
(x => x * 2)(2)
电线2, 连接到电路模块的x电线端子, 将值2绑定x, 电流流经导线, 流到x*2,
在电线连接到电路模块后, 电流通过这根电线到达另外一端, 此时如果电线导电性良好, 两头的电压应该几乎相等。这个使得电路模块运转起来这个过程我们叫做"函数调用"。
下面来说说函数体(body):
它的逻辑大体看起来, 是枝丫分明的树状结构, 程序所做的几乎一切事情都是信息传递的分支(电流流经导线, 分离或者汇合), 如果我们这样思考, 代码中就会比较少出现只有一个分支的if语句, 它看起来就会像这样:
if (...) {
if (...) {
...
} else {
...
}
} else if (...) {
...
} else {
...
}
为什么要使用"电线"和"电路"模块的角度来解释函数原因有2
- 程序所做的几乎一切事情都是信息传递的分支, 电流流经导线, 分离或者汇合,
- 如果你知道什么是AST树,
你就会发现其实树结结构的节点和电路模块有着异曲同工之妙, 连接两个节点直接的线, 其实就是"导线"。
其实我不是第一个人想到这种类比的方式, 比我还早想到这东西的那个叫王垠