- 主题:rust学习笔记
rust学习笔记
阅读《Rust 程序设计语言 中文版》的读书笔记
1. 基本语法方面,目测还是类C/C++风格,变量类型还是强类型定义,只是定义方式上有很多编译器自动推断,相当于语法糖。
目前还在看文档,没搭建开发环境,推测应该不允许修改变量类型。
2. 指针这个鬼东西
a. rust的文档里面没有对基本类型(栈上分配),对象(堆上分配)进行严格区分定义与说明,这块够坑的,按说这种定义是必不可少的,C++里面有new,java其实也是可以认为new这个调用对其进行了区分。
b. rust为了避免指针带来的花式问题,对指针的使用进行了十分严格的约束:
i. 目测rust中的指针是个强化版的基于引用计数的智能指针,强化的地方在于通常情况下智能指针的引用计数只能是1,也就是文档中的所有权转移。只有一个智能指针能够维护对象,当这个智能指针离开代码块/当前栈时,要么因为离开而销毁,要么是因为函数调用,在下一层栈上做了一次智能指针的跨栈拷贝复制,完成了所有权的转移。
ii. 由于调用函数传参这个跨栈行为也要转移所有权,所以调用函数传参会失去做参数的对象,需要函数在最后再把这个对象返回回去就很坑。
解决方案是引用这个概念。
rust的引用默认是只读的,不可修改引用传递的对象,除非声明是mut。一个对象可以同时有多个只读引用存在,但只能有一个mut(可变)引用存在,且只读引用和可变引用不能共存。这里有点读写锁的意思了。
iii. 感觉rust里面很多东西都是默认只读的,这块还没细研究。
iv. 如果是严格单线程函数调用栈的模式,这种基于引用计数的对象生命周期管理是没问题的,甚至都不需要严格要求计数=1,都不会出事儿。感觉rust这么严格地要求计数=1,是为了保证多线程时同一个对象只能由一个线程持有,避免数据竞争。还没看到多线程,而且这样的限制,似乎会对业务灵活性和性能产生不良影响,等看到多线程的时候再说吧。
3. Slice 切片:
看起来很像python中slice的用法,不过传参时因为要以引用形式传参,必须写&,有点烦,按说应该可以语法糖一下。也有可能是要求调用函数传参时明确说明是传对象还是引用,以保证调用方知道所有权是否发生了转移。
4. Enum 枚举
a. rust的枚举本身功能挺强大的,跟struct可以结合起来用。
b. rust语法拒绝了Null,然后用Option这个类来解决这个问题,等于是对需要使用Null的场景进行了更强的约束,要求在设计层面就尽量避免使用Null的概念,推升了使用Null的成本。这种推高使用成本,要求设计阶段就把各种事情想明白的设计思想贯穿rust,是rust的语言哲学。
c. Option的用法文档没太看明白,里面涉及的各种语法特性挺多的。
5. 包管理
a. 文档看得一头雾水,看的是官翻中文版,感觉之前英文版写得就很无脑。
b. 又看了看CSDN上的一篇,稍微好点吧。
i. 最顶层是workspace,相当于一个单人或多人协作项目,大约等效于VS里面的一个solution。
ii. package:这里就开始奇怪了,一个package里面可以有多个可执行文件,也就是进程入口,但只能有一个lib(c性质的lib,或者dll)。感觉这比较接近于一个VS里面的project,不过project只能是可执行类型,或者lib类型,且只能有一个可执行文件。
iii. crate:奇怪的名称,独立可编译单元,可执行的要有main.rs,库类型的要有lib.rs,这么看感觉和package很类似
iv. module:关键字mod,就是个命名空间,于实际文件、构建等过程无关。
未完待续
--
FROM 1.202.141.*
最近也学习了rust 整体上 其在编译期各种检查和语法规定 的确在内存安全等方面做的很严格
但是也感觉其为了灵活性或者显式指明编译器选择 做了太多的特殊规则
很多逻辑很不一致
【 在 kawolu 的大作中提到: 】
: rust学习笔记
: 阅读《Rust 程序设计语言 中文版》的读书笔记
: 1. 基本语法方面,目测还是类C/C++风格,变量类型还是强类型定义,只是定义方式上有很多编译器自动推断,相当于语法糖。
: ...................
--
FROM 223.104.41.*
实现copy trait的基本类型 int float char boole 及其前述类型的元组和数组 在栈上
结构体如果编译时可以确定size的在栈上 其他可能在堆上
而且我现在越来也感觉 编译时确定大小 不是以字段header头的大小(类似栈上的胖指针)而是以对应的数据区域大小判断的
例如 String类型 理论上 栈上的胖指针 大小时确定的 只是实际值不确定 可以如果做struct字段 大概率会分配到堆上
rust 很多类型的可能属性 是需要通过trait声明的 例如 sized copy clone之类
【 在 kawolu 的大作中提到: 】
: rust学习笔记
: 阅读《Rust 程序设计语言 中文版》的读书笔记
: 1. 基本语法方面,目测还是类C/C++风格,变量类型还是强类型定义,只是定义方式上有很多编译器自动推断,相当于语法糖。
: ...................
--
修改:nextworld8 FROM 223.104.41.*
FROM 223.104.41.*