我还写过一篇文章来痛批Rust,就是下面这篇:
Rust语言到底有没有未来?
学过了这么多编程语言,在Rust这里却碰壁了!
为什么?
想了一段时间,我的脑袋里面蹦出了一个词-“GC”,也就是垃圾收集,内存自动分配和回收!
我最近的经历,其实都是在写应用软件,搞SQL,搞Crud。
大部分场景里面,Java、C#、Go都提供了GC选项,而且不止如此,在不需要考虑内存问题的基础上,他们还提供了Springboot应用框架、Mybatis数据Orm层、Log4j内存访问日志。
如果说原来的C/C++等需要自己管理内存的语言是手动档汽车,那么上面这些编程语言+框架的组合就不只是自动档汽车那么简单,那简直就是一艘飞机了。
中间隔了很多层,已经无法达到短时间就能掌握的程度。
而“短时间就能掌握”,恰恰是已经掌握一种编程语言去看另外一种语言的常态。
这也是大部分学Rust感到挫败的原因!
克服这个难点,我最近也有了一些心得!
那就是需要从一个C++/C语言的使用者来看看Rust的问题!
Rust和C/C++对待内存的看法实际上就只有一个,C/C++默认的“=”操作是Copy指针,而Rust则是Move指针。
当用=来进行操作的时候,譬如
s1=s2
在Rust里面,s2就是获得了s1里面内容的所有权,而s1则没有了权力,再使用它就会报错!
在C里面,s2和s1则是指向同一个位置的不同指针。
默认“=”的语义,就是Rust和C系语言的不同之处!
但是,如果想要Copy怎么办呢?
Rust在语言内部有了Copy和Move两个trait接口,只要你实现了Copy,就可以实现Copy!
但是,为了基础类型(如int、float)变量使用类型的方便,他们默认实现了Copy。
这个就是Rust的大坑。
当其他语言的人来学Rust,一般都从基础变量类型开始,写个HelloWord,来个a=5,这个时候,Rust并没有什么不同。
当他们开始稍微前进一步,需要高级一点操作的时候,Copy/Move系统就开始运行了,报错就开始了!
那些人,如果我一样,看着屏幕,看着那些洋文,心想“这TM不都是基本操作,这破笔语言怎么不行啊?”
然后去百度一下,“哦哦,原来是这样。。”
改正了,可以运行了!
过了一阵,我擦,怎么又报错了,再改!
在耐心被消耗殆尽的时候,就会上公众号,写一篇文章:
Rust语言到底有没有未来?
发泄一下情绪,给自己找个理由,傻缺语言,狗都不用,我更不用了,弃坑!
我想,这就是Rust与我而言的一个坑-Copy/Move系统。
当然,我最近已经进行了反思,思考了几个问题:
1、如果我写一个C语言,在主main里面malloc了一个内存,但是在子函数里面free了,系统会怎样?
2、我如何保证不同的变量在函数之间,其内存不被释放。
3、如何保证内存在释放之后,还不被再次释放?
想到了这些问题,瞬间我似乎对Rust的内存管理问题有了一些新的体会!
我是明月,
继续学习Rust中!