用可视化案例讲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.mzph.cn/news/591222.shtml

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

相关文章

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

Android Studio xml布局代码补全功能失效问题

这里写目录标题 前言&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;1.更新 Android Studio 版本2.原版本解决XML补全失效 小结 前言&#xff1a; 在开发过程中&#xff0c;你可能遇到很多奇奇怪怪的问题。Android Studio 编译器出现问题也是常有的事情&#x…

单片机开发--keil5

一.keil5 Keil uVision5是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于对嵌入式系统中的微控制器进行编程。它是一个软件套件&#xff0c;包括源代码编辑器、项目经理、调试器以及微控制器开发、调试和编程所需的其他工具。Keil uVision5 IDE主要用于对基于A…

线性代数基础知识

计算机视觉一些算法中常会用到线性代数的一些知识&#xff0c;为了便于理解和快速回忆&#xff0c;博主这边对常用的一些知识点做下整理&#xff0c;主要来源于如下这本书籍。 1. 矩阵不仅仅是数字排列而已&#xff0c;不然也不会有那么大精力研究它。其可以表示一种映射 关于…

Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换&#xff0c;可以处理超过100种图像格式&#xff0c;包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作&#xff0c;即可以通过命令行进行&am…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

python解决一维动态规划问题,寻找丑数

对于一维动态规划问题中&#xff0c;还有一个可能会经常遇到的问题&#xff0c;就是寻找丑数。 对于丑数的概念是&#xff0c;把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添…

Vue-响应式数据

一、ref创建基本类型的响应式数据 vue3可以使用ref、reactive去定义响应式数数据。 知识点汇总 使用ref需要先引入ref&#xff0c;import {ref} from vue在模板 template 中使用了添加ref 的响应式数据&#xff0c;变量的后面不用添加.value所有js代码里面&#xff0c;去操作r…

【web】vue 播放后端(flask)发送的 mp3 文件

文章目录 演示后端&#xff08;flask&#xff09;前端&#xff08;vue3&#xff09;重要说明 演示 后端&#xff08;flask&#xff09; 后端返回的是 mp3 文件的 url&#xff0c;是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…

Python - 数据结构与算法之 排列与组合

目录 一.引言 二.排列 A-Permute ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 三.组合 C-Combine ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 四.经典算法题目 1.全排列 [无重复] 2.全排列 [有重复] 3.组合 [可重复] 4.子集 [无重复] 5.子集 [有重复] 五.总结 一.引言 关于排列…

云原生十二问

一、什么是云原生&#xff1f; 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序&#xff0c;可以快速更新以满足客户需求。为此&#xff0c;他们使用现代工具和技术&#xff0c;这些工具和技术本质上支…

科普帖:什么是XaaS-一切皆服务模型(包含10个示例类别)

有时似乎有太多的商业首字母缩写词要记住。随着快速变化的技术进步和云计算的出现&#xff0c;新的类别将不断涌现。XaaS 就是这样一个最新的补充。 该领域的大多数读者都知道SaaS&#xff08;软件即服务&#xff09;、IaaS&#xff08;基础设施即服务&#xff09;和PaaS&…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

强大的隐藏应用 Hides 5中文 for mac

Hides 5是一款Mac上的应用程序&#xff0c;旨在帮助用户隐藏其他应用程序并专注于当前任务&#xff0c;从而提高工作效率。其主要功能包括对焦模式、隐藏所有打开的应用程序、隐藏除当前活动应用之外的所有打开的应用程序、支持全局热键、可定制性、支持多种显示方式等。 Hide…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数&#xff0c;则没有最中间的数&#xff1b;此时中位数是最中间的两…

注意力机制(attention mechanism)

1、注意力 灵长类动物的视觉系统接收了大量的感官输入&#xff0c;这些感官输入远远超出了大脑能够完全处理的能力。然而&#xff0c;并非所有刺激的影响都是同等的。意识的汇聚和专注使灵长类动物能够在复杂的视觉环境中将注意力引向感兴趣的物体&#xff0c;例如猎物和天敌。…

【XR806开发板试用】FreeRTOS创建任务测试

这篇来学习下&#xff0c;XR806开发板在FreeRTOS系统下创建两个任务测试&#xff0c;由于没有找到学习的文档&#xff0c;试着参考例程来测试。 一、复制工程 上篇测试了hello_demo的测试例程&#xff0c;直接复制这个工程文件&#xff0c;在此基础上修改 rootubuntu:/home/…

HarmonyOS官网案例解析——保存应用数据

介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动滑块改变字体大小系数&#xff0c;列表页和调节页面字体大小同步变化。往右拖动滑块字体…

Linux安装consul的两种方式(在线和离线)

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;软件概述 &#x1f4da;第二章 部署&#x1f4d7;在线部署&#x1f4d5;需要root权限&#x1f4d5;执行安装命令&#x1f4d5;启动consul服务&#x1f4d5;验证consul服务 &#x1f4d7;离线部署&#x1f4d5;下载…