用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程

1. 怎么能学会Rust

如果要列举Rust的优势,恐怕写个十条八条是写不完的,而且不管写哪条优势,都有很多同学跳起来反驳,比如我们说Rust比C/C++内存安全,肯定有同学说C++ 20也支持内存安全,或者我写C++比斯特劳斯特卢普写得更好,写了十年没有发生过任何内存泄露……

但是,反过来,我要说Rust最大的问题,恐怕没人会反驳,包括我这种花了三次才入门,然后又做砸了两个项目才勉强算学会,能够进入工程级开发的新人老手……

那就是:难学!

Rust的学习曲线,号称是所有编程语言中最陡峭的,就连Rust基金会,都把降低学习曲线,当成Rust发展的当务之急:

img

原文地址:https://blog.rust-lang.org/inside-rust/2022/04/04/lang-roadmap-2024.html

(注意:不是2023才提,是每一年的roadmap,都特么要提一次,这玩意儿真的不好学……公认)

官方的说法:

many people report a sense of high "cognitive overhead" in using it, and "learning curve" remains the most common reason not to use Rust. The fact is that, even after you learn how the Rust borrow checker works, there remain a lot of "small details" that you have to get just right to get your Rust program to compile.

翻译过来就是:这玩意儿会有很高的认知开销,陡峭的 学习曲线 是大家不会(没法)使用Rust的最常见原因。

因为即使了解了Rust里面最麻烦最焦头烂额的特性:借用检查器所有权机制)的工作原理后,仍有许多乱七八糟的小细节需要去正确处理,否则Rust编译器会好好的教你做人……

img

所以,很多公司,把Rust当成了一个测试题,但凡能够自学学会这个可(cao)爱(dan)的语言的,起码自驱能力必然是MAX……

就以智商中人水平的我来说,学习Rust一共学了三次……

第一次花了两个月,把书和代码敲了一遍,自我感觉好像学会了,然后……很快啊,我告诉你,真的很快啊……(就和学英语一样)我就忘记了……

第二次,是疫情居家办公,反正在家,所以我又用了一个来月,再次入门,而且这次还专门用Rust写了一系列的工程,例如GRPC和Python扩展包啥的,然后又自我感觉又行了……结果上班不超过两个月……好吧,又忘记了。

就有第三次入门,这次我都差点放弃,心想爱咋咋地吧,反正遇上了,就照着网上的代码ctrl + CV 吧。。。就这样,我这个半桶水还用Rust基于PGRX写了好几个扩展插件,还应付了包括国密测评在内的不少工作……

要不说,写代码,赶dead line,才是学习唯一的光……

img

要说我这种中等智商 + 马上45学习能力大退化的(四舍五入知天命)的半大老头,都最后勉勉强强算学会了,我觉得其他同学学会应该也是没啥问题的。

所以今天我秉持一贯说人话的原则,来和大家聊聊怎么样更快的学会Rust(以及你想学的其他编程语言也行)

2. 战略上要藐视敌人

所有同学(哪怕类似我这种写了十几年代码的老码农),一眼抗拒的原因,很大可能就是看到了一些大神写的Rust典型编码风格的代码,例如:

  • 引用与解引用的hello world的例子:
let reference = &4;
match reference {&val => println!("Got a value via destructuring: {:?}", val),
}
match *reference {val => println!("Got a value via dereferencing: {:?}", val),
}let _not_a_reference = 3;
let ref _is_a_reference = 3;
let value = 5;
let mut mut_value = 6;
match value {ref r => println!("Got a reference to a value: {:?}", r),
}
match mut_value {ref mut m => {*m += 10;println!("We added 10. `mut_value`: {:?}", m);},
}

img

  • 泛型的hello world:
impl <A: TraitB + TraitC, D: TraitE + TraitF> MyTrait<A, D> for YourType {}impl <A, D> MyTrait<A, D> for YourType whereA: TraitB + TraitC,D: TraitE + TraitF {}

img

  • 生命周期的hello world
#[derive(Debug)]struct Borrowed<'a> {x: &'a i32,}
impl<'a> Default for Borrowed<'a> {fn default() -> Self {Self {x: &10,}}
}

img

就这种写法,就算你是一个资深C/C++开发工程师,都会发懵,更别说我这种写Python的二流码农了……

第一时间被劝退了有没有。

所以,开始学习的时候,千万别去大神们写的标准Rust编码风格、模式优美,代码简练的所谓的优质开源源码,你得从简单的看起,这样才能真正明白是干嘛的。

为什么说看简单的能入门呢?我们下面看看两个大家都认为很难,但是实际上看一眼就发现很简单的东西,就是GDAL的源码:

//带弧线的几何面积计算
double OGRCircularString::get_AreaOfCurveSegments() const
{double dfArea = 0.0;for (int i = 0; i < getNumPoints() - 2; i += 2){const double x0 = getX(i);const double y0 = getY(i);const double x1 = getX(i + 1);const double y1 = getY(i + 1);const double x2 = getX(i + 2);const double y2 = getY(i + 2);double R = 0.0;double cx = 0.0;double cy = 0.0;double alpha0 = 0.0;double alpha1 = 0.0;double alpha2 = 0.0;if (OGRGeometryFactory::GetCurveParameters(x0, y0, x1, y1, x2, y2, R, cx, cy, alpha0, alpha1, alpha2)){const double delta_alpha01 = alpha1 - alpha0;const double delta_alpha12 = alpha2 - alpha1; dfArea += 0.5 * R * R *fabs(delta_alpha01 - sin(delta_alpha01) + delta_alpha12 -sin(delta_alpha12));}}return dfArea;
}

——咦,不是说GDAL/CPP很难么?(恐怕绝大部分做GIS的同学,都没有看过GDAL的源码)为什么这个方法我能看懂?

现在回过头来,软件的组成方式是什么?软件最底层的啥?有同学说,当然是指令啊——CPU指令集是软件最底层的组织方式,所以吧啦吧啦……

img

好吧,不谈底层,那是硬件码农们的领域,对于我们这些软件码农来说,我们能够接触到的最底层的代码组织模式就是——语句,每个程序,都是由执行具体操作的语句所组成的,然后这些语句,集合起来,形成的函数(或者叫方法也行,function),而一个函数则是一个一个最基本的功能逻辑实现体。

所以,我们在学习语言的时候,先不要一上来就高屋建瓴的去玩高端局,咱们得从最简单的入手,那么写起来也就简单了。

所以这次我们通过最简单的一个学习流程,来和大家一同来学习Rust的开发,别担心,你可以没有任何Rust的开发经验,但是你得有基础的代码编写能力,不管是Java、Python、JavaScript还是C#也都行。

恩,这里写的东西,主要是给我们GIS圈的同学看的,所以一些GIS基本概念,例如坐标几何要素点线面mapboxshapefilegeojson啥的,我就不解释了……

老规矩,先看效果,在讲实现——用Rust绘制一个百度风格的地图:

(啥,你问我为什么老是绘制百度地图,不能绘制点其他的风格么?答……百度风格挺好看的,而且最简单……)

img

放大之后:

img

看完之后,可能有同学会问:虾神,你这个地图怎么鸡里鸡气的(JavaScript的鸡)……

好吧,Rust本身就不是用来做可视化的,他的可视化能力不能说没有吧,起码和没有也差不多了……这个可视化用的是Rust封装了plotly,然后在web上绘制出来的,就是下面这个:

img

用Rust封装之后,就是这个:

img

所以,就不要在那些细节了,再说:

img

至于怎么实现的,我们下回分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数组:一维数组、二维数组、Arrays

文章目录 1、一维数组1.1 数组概念1.2 数组的声明1.3 数组的静态初始化1.4 数组的动态初始化1.5 地址值1.6 数组元素访问1.7 索引1.8 数组的遍历1.9 数组两种初始化方式的区别 2、二维数组2.1 二维数组的声明2.2 二维数组的静态初始化2.3 二维数组的动态初始化2.4 二维数组的遍…

LCD—液晶显示

本节主要介绍以下内容 显示器简介 液晶控制原理 秉火3.2寸液晶屏简介 使用FSMC模拟8080时序 NOR FLASH时序结构体 FSMC初始化结构体 一、显示器简介 显示器属于计算机的I/O设备&#xff0c;即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。…

计算机毕业设计 基于Javaweb的城乡居民基本医疗信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【Linux Shell】2. Shell 变量

文章目录 【 1. 变量命名规则 】【 2. 变量的使用 】【 3. 只读变量 】【 4. 删除变量 】【 5. 变量类型 】【 6. Shell 字符串 】6.1 字符串分类6.2 字符串操作 【 7. Shell 注释 】7.1 单行注释7.2 多行注释 【 1. 变量命名规则 】 定义变量时&#xff0c;变量名不加美元符号…

Linux系统使用超详细(八)~磁盘管理

目录 一、认识磁盘 二、磁盘运行机制 三、磁盘检查 3.1查找设备名称和分区号 3.1.1使用lsblk命令&#xff1a; 3.1.2使用fdisk命令&#xff1a; 3.1.3使用blkid命令&#xff1a; 3.2检查方向 3.2.1文件系统完整性&#xff1a; 3.2.2磁盘健康状态&#xff1a; 3.2.3磁…

2024-python画图永久解决 matplotlib 中文乱码

2024-python画图永久解决 matplotlib 中文乱码 不多说了吧&#xff0c;大家肯定是自己安装了python&#xff0c;这些环境了&#xff0c;毕竟都知道乱码了&#xff0c;所有此处省略1万字&#xff0c;如果这些前期不会的&#xff0c;就不要来找我了&#xff0c;自己解决&#xf…

均匀与准均匀 B样条算法

B 样条曲线的定义 p ( t ) ∑ i 0 n P i F i , k ( t ) p(t) \sum_{i0}{n} P_i F_{i, k}(t) p(t)i0∑​nPi​Fi,k​(t) 方程中 n 1 n1 n1 个控制点&#xff0c; P i P_i Pi​, i 0 , 1 , ⋯ n i0, 1, \cdots n i0,1,⋯n 要用到 n 1 n1 n1 个 k k k 次 B 样条基函数 …

DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选

参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

web期末个人引导页透明版

效果图 代码 css代码 * {box-sizing: border-box; }body {color: #2b2c48;font-family: "Jost", sans-serif;background-image: url(../img/bg.jpg);background-repeat: no-repeat;background-size: cover;background-position: center;background-attachment: fix…

在 PyCharm 中使用 Copilot

GitHub Copilot 由 OpenAI Codex 提供支持&#xff0c;可帮助用户在编辑器中实时工作。 它使用强大的 GPT-3 模型版本&#xff0c;该模型在大量开源代码上进行训练。 此外&#xff0c;GitHub Copilot 可在不同的 IDE&#xff08;集成开发环境&#xff09;上使用&#xff0c;包…

【数据仓库与联机分析处理】数据仓库工具Hive

目录 一、Hive简介 &#xff08;一&#xff09;什么是Hive &#xff08;二&#xff09;优缺点 &#xff08;三&#xff09;Hive架构原理 &#xff08;四&#xff09;Hive 和数据库比较 二、MySQL的安装配置 三、Hive的安装配置 1、下载安装包 2、解压并改名 3、配置环…