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

news2024/11/24 18:33:53

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

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

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

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

相关文章

QT布局组件

时间记录&#xff1a;2024/1/8 一、整个页面各位置的详细图片 这些的布局都可以通过QSS来进行修改 二、非QSS的一些布局组件 2.1 QHBoxLayout水平布局组件 常用属性&#xff1a; &#xff08;1&#xff09;spacing&#xff1a;子组件间的间距 &#xff08;2&#xff09;st…

关于电脑屏幕亮度的调整,看这篇文章就够了

你可能需要定期更改屏幕亮度。当外面很亮的时候,你想把它调大,这样你就能看到。当你在黑暗的房间里时,你会希望它变暗,这样就不会伤害你的眼睛。降低屏幕亮度也有助于节省电力并延长笔记本电脑的电池寿命。 除了手动更改屏幕亮度外,Windows还可以通过多种方式自动更改屏幕…

MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log)

文章目录 MySQL 8.0 InnoDB 架构之 日志缓冲区&#xff08;Log Buffer&#xff09;和重做日志&#xff08;Redo Log&#xff09;REDO相关主要参数innodb_log_buffer_size innodb_redo_log_capacityinnodb_log_group_home_dir参考 【免责声明】文章仅供学习交流&#xff0c;观点…

进程间通信之匿名管道和命名管道的理解和实现【Linux】

进程间通信之匿名管道和命名管道的理解和实现 进程间通信什么是管道匿名管道代码实现管道的读写规则管道特点 命名管道创建命名管道代码实现 进程间通信 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同…

java基于ssm框架的滁艺咖啡在线销售系统+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装滁艺咖啡在线销售系统软件来发挥其高效地信息处理的作用&am…

对接讯飞聊天机器人接口--复盘

1、准备工作 1&#xff09;、进入以下平台进行注册&#xff0c;登录后&#xff0c;点击红框处 2&#xff09;、点击个人免费包&#xff08;会弹出实名认证&#xff0c;先进行实名认证&#xff09; 3&#xff09;、认证后&#xff0c;会进入以下界面&#xff0c;先添加应用 4&am…

特征工程(一)

特征工程&#xff08;一&#xff09; 什么是特征工程 简单来讲将数据转换为能更好地表示潜在问题的特征&#xff0c;从而提高机器学习性能 特征工程包含的内容 转换数据的过程特征更好地表示潜在问题提高机器学习性能 数据和机器学习的基础知识 数据基础 以下为数据的一…

三剑客前端教程

前端教程 结构层&#xff08;html&#xff09;表现层&#xff08;css&#xff09;行为层&#xff08;javascript&#xff09; HTML 超文本标记语言&#xff09; HTML&#xff08;超文本标记语言——HyperText Markup Language&#xff09;是构成 Web 世界的一砖一瓦。它定义…

ssm基于HTML5的交流论坛的设计与实现+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

ME11/ME12拷贝采购信息记录

注意点&#xff1a; ECC没有好用的修改/创建采购信息记录BAPI所以使用BDC处理&#xff0c; 因为BDC执行过程如果遇到黄色提示消息就会暂停&#xff0c;所以如果遇到黄色提示需要增强处理 还有就是价格的小数位数问题&#xff0c;如JPY不能使用小数位数问题处理 增强调整 如下…

软件测试|Linux基础教程:cp命令详解,复制文件或目录

简介 在Linux系统中&#xff0c;cp命令是一个非常常用且强大的命令&#xff0c;用于复制文件和目录。cp命令允许我们在不同目录之间复制文件或目录&#xff0c;并可以根据需求对文件复制的行为进行调整。在本文中&#xff0c;我们将详细解释cp命令的用法以及一些常见的选项。 …

spark的任务提交方式及流程

本地模式 local 测试用,不多赘述 分布式模式 standalone standalone集群是spark 自带的一个资源调度集群&#xff0c;分为两个角色&#xff0c;master/worker&#xff0c;master负责接收任务请求、资源调度&#xff08;监听端口7077&#xff09;&#xff0c;worker负责运行exec…

深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析

工程项目管理软件是现代项目管理中不可或缺的工具&#xff0c;它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件&#xff0c;该软件采用先进的Vue、Uniapp、Layui等技术框架&#xff0c;涵盖了项目策划决策、规划设计、施工建设到竣工交付…

Java如何拷贝数据?

Java如何拷贝数据&#xff1f; 在 Java 中&#xff0c;数组和集合的深拷贝与浅拷贝的概念与复制对象的引用和内容相关。深拷贝是创建一个新对象&#xff0c;并递归地复制其所有内容&#xff0c;而浅拷贝则只是复制对象的引用。 数组的深拷贝与浅拷贝&#xff1a; 1. 深拷贝数…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

量子革命的基础:激光冷却史(下)

本文是《激光冷却史》系列的最后一部分。 在20世纪的最后20年里&#xff0c;原子物理学家屡次打破宇宙中最冷温度的记录。这些成就有赖于一些进步&#xff0c;包括激光冷却&#xff08;《激光冷却史&#xff08;上&#xff09;》&#xff09;、磁光阱和西西弗斯冷却等技术&…

DES算法(Python实现)

一、具体描述 基于计算机高级语言&#xff08;如C语言&#xff09;实现DES算法 二、名词术语与相关知识 DES算法 DES&#xff08;Data Encryption Standard&#xff09;是一种对称加密算法&#xff0c;被广泛应用于数据加密领域。它使用64位密钥和64位明文&#xff0c;通过…

西门子WinCC的C脚本——对象的事件任务

1、 全局脚本编辑器&#xff1b; 2、 对象的属性任务&#xff1b; 3、 对象的事件任务。 本文探讨一下用C脚本来实现对象的事件任务。 一、例程说明引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 如图1所示&#xff0c;为本例程的运行画面。本例程实现以下…

大数据 Hive - 实现SQL执行

文章目录 MapReduce实现SQL的原理Hive的架构Hive如何实现join操作小结 MapReduce的出现大大简化了大数据编程的难度&#xff0c;使得大数据计算不再是高不可攀的技术圣殿&#xff0c;普通工程师也能使用MapReduce开发大数据程序。 但是对于经常需要进行大数据计算的人&#xff…

没经验没资金,适合穷人创业项目的低成本生意

什么人可以赚到钱呢&#xff1f;不管你怎么都赚不到&#xff0c;那归根结底是因为你身边没有明白人。像我们普通人一没经验二没资金三没人脉&#xff0c;该如何创业呢&#xff1f; 第一点&#xff0c;如果你不知道干什么&#xff0c;就做黄牛&#xff0c;只当渠道&#xff0c;只…