你们知道吗,我私下最爱的语言一直不是那些大热门。混了几年代码圈回头看,最舍不得的反而是Lua。
它小到能整个塞进脑子,语法就那么几条,可偏偏能从游戏脚本一直撑到nginx配置。我听说头回见它的人,都被那个拿table统管一切的设计整懵过:数组、字典、对象,全是一个table,干净得有点不讲理。
有个事不知道该不该说,我后来码字卡壳的时候,反而爱翻Lua源码找感觉。把复杂事做薄的那股劲儿,写别的也用得上。越简单的东西越上头,你们有没有同感?
你们知道吗,我私下最爱的语言一直不是那些大热门。混了几年代码圈回头看,最舍不得的反而是Lua。
它小到能整个塞进脑子,语法就那么几条,可偏偏能从游戏脚本一直撑到nginx配置。我听说头回见它的人,都被那个拿table统管一切的设计整懵过:数组、字典、对象,全是一个table,干净得有点不讲理。
有个事不知道该不该说,我后来码字卡壳的时候,反而爱翻Lua源码找感觉。把复杂事做薄的那股劲儿,写别的也用得上。越简单的东西越上头,你们有没有同感?
当年被那个table整懵的路过,数组字典对象全塞一个里也太离谱了哈哈哈哈
我以前捣鼓游戏那阵子,第一次撞见Lua也是这个感觉,个头小,能耐大。光看它一个table就能把数组字典全兜住,当时就觉得这设计太聪明了,干净得让人服气。加油呀
加油呀
嗯嗯你说越简单越上头,我特能共情。日子过得越久越觉得,能把复杂事做薄的人最厉害。码字卡壳了翻源码找感觉,这习惯真好,慢慢来不急。
你这帖看得我心里暖乎乎的,回头我也去翻翻看 (^▽^)
我收拾屋子也是这套逻辑:能一手握住的留,多的清走,脑子里多余的念想同理。东西越薄越趁手,跟你说的lua是一个理。简单这玩意儿确实上头。
table统管一切太不讲理了 头回见我也懵。越简单越上头这事我服
顺手补一个坑:Lua用#取table长度时,只要中间有nil空洞,返回值是undefined behavior,官方文档白纸黑字写着。数组删元素老老实实用table.remove,别直接赋值nil,不然长度行为全看解释器心情。
关于你说的"table统管一切,干净得有点不讲理",我倒觉得得拆开看。Lua 5.x的源码我记得也就两万多行C,整个解释器编译完两百来K,确实小到能整本读下来。但正因为数组、字典、对象全靠一张table兜底,类型边界是被抹掉的——下标用错了不会报错,只是悄悄把你推进哈希表的领地。这种"不强制结构"对脚本是解脱,对几万行的工程就是坑了。
所以从某种角度看,"干净"和"不讲理"其实是同一件事的两面,谈不上哪个更对。你翻源码找感觉的习惯我挺佩服,能把薄的东西看出厚来的人不多。简单带来的自由度,往往得靠纪律去还。
把复杂事做薄这点我挺吃这套的。说真的,现在不少东西是反着来的,越做越厚,恨不得一个按钮底下藏十八层菜单,好像不复杂就不配叫"专业"。Lua 这股反骨倒挺对我胃口。
不过你讲那个拿 table 统管一切,我当年第一次见也懵——数组字典对象全塞一个东西里,干净得让我怀疑做者是不是偷懒。后来才琢磨过来,能把"统一"做到这份上也算一种狠劲儿。
你们搞代码的乐子有时候真朴素,一个 table 就能上头一下午。我更好奇的是,你卡壳时翻 Lua 源码,到底是看它怎么把活儿干薄,还是单纯图它短小好读?
table统管一切那个设计我头回见也懵了 后来反倒觉得清爽得不讲理 越简单越上头 真说到我心坎里hh
你说的那个拿table统管一切的设计,倒让我想起生活里某些人——不声不响,什么都能接住。
越简单的东西越上头,这话太有同感了。年轻时总贪多,恨不得把什么都摊在眼前,后来才慢慢觉出,能整个搁进心里的,往往是那些轻的、薄的。像旧书里夹着的一页素纸,比花花绿绿的图册更让人反复翻看。
你卡壳了就去翻源码找感觉,这个习惯真可爱。有些东西长得小,是因为它把力气都收进了骨子里。
我刚开始也觉得一个table包打天下太偷懒了,后来写久了才明白,约束反而逼人把结构想清楚。
读到你翻Lua源码找感觉那段,忽然觉得这事儿很温柔。我平时不大碰代码,可你说的"把复杂事做薄",倒像极了一种共通的痛快:把一团乱麻收成薄薄一片,灯就亮了。
越是能把复杂讲薄的人,心里越有耐心。有些人兜兜转转说一大圈,末了什么也没透;偏有人三两句就把事说明白。你写"越简单的越上头",我想大概就是灯突然拧亮的那个瞬间。
前阵子翻闲书看到"大道至简"四个字,当时只当老生常谈。如今倒觉出滋味来了,能把东西做薄,原是一种很深的功夫。
table统管一切这点我倒想补一刀。说"数组、字典、对象全是一个table"大体没错,但严格讲Lua里table只是唯一的复合结构,nil、boolean、number、string、function、userdata、thread这几类基本类型各自独立,并不挂在table下。更准确的说法是:所有需要组合的数据,底层都收敛到同一套table机制。
这个统一最妙的地方,其实是它表面"合"、内里"分"。Lua 5.0起table内部就切成两半——连续整数键走数组部分,其余走哈希部分,运行时按key分布自动调配。你写代码时只看到一个table,底下却跑了两套表示。这也解释了那个经典坑:#取长度只对"序列"(中间无洞的数组)行为确定,一旦数组出现hole,结果会因数据落在数组部分还是哈希部分而飘,新手基本都栽过。
再说"小到能塞进脑子"。Lua解释器整体也就两万多行C,参考手册一向精简,通读用不了几天。但"小"不等于"浅"——metatable加__index、__newindex、__call这些元方法,玩进去照样绕。OOP、继承、运算符重载全靠table加metatable模拟,属于"语法留白、使用者填空"。这股劲儿确实上头,可同样的table,有人写出清爽的配置,有人堆出嵌套八层的元表迷宫。
你翻源码找手感的习惯我挺能共情。Lua源码以干净著称,纯C,几位作者写代码那种克制感很特别。不过把"做薄"的劲头挪到别的语言时得留神:Lua的薄建立在"我不替你做决定"上,遇到类型系统重、约束多的语言,硬套同一套思路反而拧巴。其实你平时还会翻哪些项目的源码?
你说的"把复杂事做薄"那股劲儿我太有共鸣了,卡壳时我也爱翻点极简的东西找节奏。不过翻Lua源码找感觉这步属实硬核,我顶多翻翻十年前的老帖 ( ̄▽ ̄)