RUST 学习

环境

rust环境支持所有的都放在用户权限的目录,好处就是尽可能不依赖平台的限制,比如平台默认安装的版本可能比较老了。库版本的代码和编译中间文件也如此,好处就是编译速度会变快,缺点就是有些库可能因为 版本的关系,造成部分的不兼容。比如某个项目依赖A的版本从1.1(真实的支持版本)的api,但项目的依赖直接写了1.0的版本(非严格判断), 然后正好其他项目有一个1.0的版本依赖的缓存在本地,这时候编译 就会出现问题。这种方式在同类解决方案中也是相同的存在。

rust 交叉编译

列出所有支持的平台

rustup target list

安装

rustup target add x86_64-unknown-linux-musl

配置目标平台

.cargo/config(或者config.toml) 中添加或修改类似内容:

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"

编译

cargo build --release --target x86_64-unknown-linux-musl

语法

表达式和语句

表达式可以有返回值,在代码块中可以返回内容。语句则不会。大部分情况下表达式加上分号就变成语句了。

语法🍬

宏调用以 宏名! 的方式;宏声明使用 macro_rules! 宏名 的方式。 \#[macro_export] 注解用于导出宏. 宏的写法比较麻烦,主要是宏的语法匹配的是rust的结构。在本来已经复杂的结构中再弄个小语种。。。

‘语法

在代码块中作为标签;’a 显式生命周期,这一说明可以限定相关成员生命周期保持一致性;’static 静态生命周期,程序存活则一直存在,类似于静态变量了。

m..n

表示从m开始到n结束,可省略前后。用于分割,遍历,生成数组之类的等操作,类似于javascript

元组(tuple)

可能借鉴于erlang语言,与erlang的元组类似

结构体(struct)

rust的结构和函数是分开的,类似与C/C++的结构,但在结构体的函数中,又不相同。没有class的内容。方法通过 impl 的方式,可以给结构体添加各种自定义的函数,与C使用结构体和函数的方式相同点更多些。通过引入self 关键字来表示访问的变量指针或者this指针。Self关键字表示自身相同的结构体。结构体的变量支持访问权限。

枚举(enum)

rust极大的增强了枚举类型,相比其他语言,可以作为新的类型学习了。Option是基于enum的。

匹配(match)

可以和erlang的模式匹配 或者 elixir的模式匹配做对照学习。 if let 是match的语法糖

属性注解

用于标识各类额外的内容。以#开头, 格式: #[属性内容] ; 使用某个属性,则以 #![属性内容]的方式。 类似宏的定义和使用。通过属性注解可以实现部分编译或者运行运行,比如自动化测试代码

泛型

支持类似C++模板的操作。

trait

这个与c/c++的虚函数,java的interface 有些类似,与php的trait完全不同。 通过匹配泛型的属性(或者扩展特性),配合where条件限定,可以实现相同的函数名字,不同的函数签名?(感觉和erlang好相似)

生命期

rust对生命期的限定非常严格,这也增加了安全性。通过RC,RefCell等组合来进行突破生命期的限定,这个设定是程序在设计的时候完成的。可以认为是对同一段内存的所有权之争。

语言比较

rust语言的学习曲线在我看来,比C/C++,java等要高很多,更不用提和php,javascript,golang这种 碰到不懂的知识点一查便知道答案的语言了。就学习的费力程度而言,甚至比我学习erlang,elixir,汇编 这种还要累。主要原因是:

  1. 关键字更复杂,当看实际代码或者学习的时候,随时准备接受新的关键字的洗礼
  2. 例外情况比较多,同样一个字符,在不同的地方会有不用的意思。比如’字符,比如+字符,当碰到新的不明白的时候,各种查资料后,然后才知道原来如此。
  3. 注解复杂,很多时候,为了查一个注解而不得不暂停并且研究很多文档
  4. 一个项目中,代码组织太复杂,虽然通过注解来允许代码最高限度的重复使用,但看着是真的累阿
  5. 语法糖太多,太自由。。。我不知道很多的语法糖是语言自身的或者是其他库扩展的,但精通十八般武艺并不是说可以同时使用十八种武器

与erlang比较

泛型部分和erlang比较相似,支持where限定,rust主要是属性限定,erlang是值限定。match也有点相似。设计模式相比,erlang应该准球的是正确与优雅。 rust应该是追求安全与效率。虽然粗略来看,并没有指针,基本都通过生命期来控制内存。但rust中各种奇奇怪怪的写法或者用法很让人头疼。大概是 OK,OK,懵逼,原来如此,再次懵逼的感觉了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据