clq
浏览(306) +
2023-12-31 13:40:39 发表
编辑
关键字:
通用语言设计
1.
变量初始化
说出来有点令人震惊,大多数现代语言声明一个变量时其实是没带有初始化的。这在使用 map/list/arr/table 这样的数据结构时非常的不便。
我稍微地总结了一下普通变量和一般都特殊处理的 string 类型变量时惊奇的发现, TypeScript 对 string 类型也是没有初始化的,好家伙!
原因当然也简单,因为 ts 是要翻译成 js 的,而 js 的变量声明后没有初始化就是 undefi ,对于同是脚本的 lua 来说,它是 nil 。
好了,你说脚本功能弱,那么 golang 这样的语言也是不能对 map 这样的结构给出初始化的!这大概是因为它们的复杂变量都是引用吧,这也没法,它底层的实现是指针嘛。也许这样设计是有原因吧,但属实没有必要,无故增加了代码量和出错的可能。
简单思索了一下,现代语言里能对复杂类型给出非空初始值的好像只有那个一直人人喊打的 C++ !
妈呀!原来真正优秀的语言设计真的是 C++ !
不过我不再用 c++ 倒不是嫌弃它语言特性不好,而是它的编译器真的太不好用了,运行时又处理不了真正的异常(当然有 SEH发行版本)。我想如果 C++ 能运行在 golang 的运行环境那就太好了,当然了我不是说 cgo 这种方式。
所以不是现在没有完美的语言,而是没有给它完美的运行时和编译环境。
1.2 小结一下各个常见语言的常见变量类型初始化结果
js/ts
普通变量是 undef 实际上就是空指针。string 要用 v = ''/v = "" 赋值,object 要用 v = {} 赋值, array/map/table 要用 v = [] 赋值。
lua
类似 js 。
c++
有完善的构造函数初始化所有类型。
java/c#/pascal
对基础类型和 string 的初始化,对复杂类型和 list/map 这些都是空指针(引用),也就是要自己手工初始化,也就是说得有个指定的入口函数。
这其实被迫多加了与业务逻辑无关的代码,而且很多。
golang
和 java/c#/pascal 差不多,但是它的 string 默认值是很特殊的,值是 nil 但可以当正常字符串使用 ... 这其实比较危险,最好还是手工给个默认值吧。
--------------------------------------------------------
所以本轮小节 c++ 完胜,脚本类表现最差。就目前的语言环境来说,还是养成初始化变量的习惯吧。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.