用可视化案例讲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 where
    A: 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用metricbeat 监控多ES集群

背景 ES 本身自带 监控&#xff0c;属于xpack 中的内容&#xff0c;为商业版&#xff0c;需要收费&#xff1b; 并且 monitor 功能必须要在security开启后才能使用&#xff0c;还有就是集群监控自己&#xff0c;将采集到的性能数据保存到本集群&#xff0c;这是一个比较差的设…

全网最全postman接口测试教程和项目实战~从入门到精通!!!

Postman实现接口测试内容大纲一览&#xff1a; 一、什么是接口&#xff1f;为什么需要接口&#xff1f; 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…

05 Ciso模拟器连接腾讯云物联网开发平台

Ciso声明&#xff1a;本篇文章基于使用腾讯云物联网平台连接自定义esp8266物联网设备(腾讯连连控制开关实现) - CSDN App改编 一、总体概览 功能描述&#xff1a; 使用腾讯连连小程序进行控制&#xff0c; Alarm&#xff08;警铃&#xff09;&#xff1a;开的时候&#xff…

python编程从入门到实践(3+4)操作列表+if语句

文章目录 第四章 列表操作4.1遍历整个列表&#xff1a;可能会发生变化的数值&#xff0c;列表可修改4.1.2遍历中的缩进 4.3创建数值列表4.3.1 使用range&#xff08;&#xff09;函数range&#xff08;i&#xff0c;m&#xff09;输出从i到m-1range(m) 打印从0到m-1 4.3.1 使用…

UVa12419 Heap Manager

题目链接 UVa12419 - Heap Manager 题意 内存以内存单元为基本单位&#xff0c;每个内存单元用一个固定的整数作为标识&#xff0c;称为地址。地址从0开始连续排列&#xff0c;地址相邻的内存单元被认为是逻辑上连续的。我们把从地址i开始的s个连续的内存单元称为首地址为i长度…

【Maven笔记3】Maven基础入门案例

本篇通过一个最基础的入门案例&#xff0c;熟悉一下maven最基础的使用方法。 编写POM maven项目的核心是pom.xml文件&#xff0c;pom定义了项目的基本信息&#xff0c;用于描述项目如何构建&#xff0c;声明项目依赖等等。 这里我们新建一个maven-demo-hello项目&#xff0c;…

thinkphp学习03-url访问模式

多应用&#xff1a;http://serverName/index.php/应用/控制器/操作/参数/值…&#xff1b;单应用&#xff1a;http://serverName/index.php/控制器/操作/参数/值…&#xff1b; http://localhost:8506/index.php Contoller下新建Test.php <?php namespace app\controlle…

Linux第14步_安装FTP服务器

安装“vim编辑器”后&#xff0c;我们紧接着“安装FTP服务器”。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失败。 2、在虚拟机界面右击鼠标&#xff0c;弹出下面的对话框 3、点击“打开终端(E)”&#xff0c;得到下面的界面 &#xff1a;…

软件测试|Linux下Python安装配置指南

在Linux中安装Python是一个简单而且重要的过程&#xff0c;因为Python是一种广泛使用的编程语言&#xff0c;许多系统工具和应用都依赖于它。在本文中&#xff0c;我将详细介绍如何在Linux系统中安装Python。 请注意&#xff0c;在本文中&#xff0c;我将以Centos为例&#xf…

Spring mvc WebDataBinder数据绑定器

前言 DataBinder 是数据绑定器&#xff0c;它的作用是把一组属性值绑定到目标对象上&#xff0c;参数绑定的方式一般是通过 Java 反射。WebDataBinder 顾名思义&#xff0c;它是专门在 Web 环境使用的数据绑定器。 “数据绑定”对于框架而言是一项基础能力&#xff0c;很多地方…

裁员+失恋或许不能比这更遭了,敬一塌糊涂与充满感动的2023,也敬曾经的挚爱与寒冬的冰霜

~ 随机抽取评论区的 3位 小伙伴送上精美礼品 ~ 参与方式&#xff1a;关注、点赞、收藏&#xff0c;评论 "2024&#xff0c;一天当做两天卷&#xff01;" 活动时间&#xff1a;截止到 2024-01-21 00:00:00 礼品清单&#xff1a;CSDN活动周边、自选图书 本文目录 序 …

Java---网络编程

文章目录 1. 网络编程概述2. InetAddress3. 端口和协议4. Java网络API5. URL6. URLConnection类 1. 网络编程概述 1. 计算机网络&#xff1a;是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软…

Unity 0GC或者最大限度降低GC方案

文章目录 GC带来的问题性能瓶颈玩家体验受损 优化关键点1. **对象池技术**&#xff1a;2. **内存管理优化**&#xff1a;3. **UGUI优化**&#xff1a;4. **ECS架构下的优化**&#xff1a;5. **资源管理**&#xff1a;6. **自定义数据结构与算法**&#xff1a;7. **开启增量GC&a…

网络嗅探器的设计与实现(2024)-转载

1.题目描述 参照 raw socket 编程例子&#xff0c;设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。 2.运行结果 3.导入程序需要的库 请参考下面链接: 导入WinPcap到Clion (2024)-CSDN博客 4.参考代码 #define HAVE_REMOTE #define LINE_LEN …

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要&#xff1a;本文介绍变量和函数的基本知识 在前面一篇中了解了变量&#xff0c;接着就来了解一下函数。函数是程序中的一个关键概念&#xff0c;它可以简化程序的编写&#xff0c;使代码更加模块化、可复用&#xff0c;提高程序的可读性。其实在之前已经多次遇到函数了&am…

VELO维乐携手【晓饰记】创始人胡晓,引领潮流新饰界!

不知道大家还记不记得2023年维乐带着自己满满的诚意闪现英伦时尚之都为全世界带来了一场无与伦比的视觉盛宴&#xff01;而依照维乐固有的执念&#xff0c;从不会让自己止步的精神&#xff0c;维乐又带着自己的维乐坐垫找到了CoCo胡晓&#xff0c;【晓饰记】的首饰品牌创始人、…

Video classification with UniFormer基于统一分类器的视频分类

本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码&#xff1a;https://github.com/Sense-X/UniFormer/tree/main/video_classification UNIFormer 动机 由于视频具有大量的局部冗余和复杂的全局依赖关系&#xf…

Matplotlib for C++不完全手册

matplotlib-cpp是Matplotlib&#xff08;MPL&#xff09;为C提供的一个用于python的matplotlib绘图库的C包装器。它的构建类似于Matlab和matplotlib使用的绘图API。 However, the function signatures might differ and Matplotlib for C does not support the full functional…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射&#xff0c;枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…