100 Exercises To Learn Rust 挑战!构文・整数・变量

前一篇文章

【0】准备
【1】构文・整数・变量 ← 本次
全部文章列表
《100 Exercise To Learn Rust》第2回,也就是实际演习的第1回!从这次开始,我们会适度减少前置说明,直接进入问题的解决!

本次的相关页面

  • 1.1. Syntax
  • 2.1. Integers
  • 2.2. Variables

[01_intro/01_syntax] 基本文法

  • 1.1. Syntax

问题如下: 

// TODO: fix the function signature below to make the tests pass.
//  Make sure to read the compiler error message—the Rust compiler is your pair programming
//  partner in this course and it'll often guide you in the right direction!
//
// The input parameters should have the same type of the return type.
fn compute(a, b) -> u32 {// Don't touch the function body.a + b * 2
}#[cfg(test)]
mod tests {use crate::compute;#[test]fn case() {assert_eq!(compute(1, 2), 5);}
}

“在Rust中,编译器是你最好的朋友,所以一定要认真听取编译器君的建议!” 大概是这个意思(非常意译)。实际上确实如此,所以这次我们首先来看一下编译错误。

$ wrRunning tests...✅ (01) intro - (00) welcome (Skipped)❌ (01) intro - (01) syntaxMeditate on your approach and return. Mountains are merely mountains.error: expected one of `:`, `@`, or `|`, found `,`--> exercises/01_intro/01_syntax/src/lib.rs:6:13|
6 | fn compute(a, b) -> u32 {|             ^ expected one of `:`, `@`, or `|`|= note: anonymous parameters are removed in the 2018 edition (see RFC 1685)
help: if this is a `self` type, give it a parameter name|
6 | fn compute(self: a, b) -> u32 {|            +++++
help: if this is a parameter name, give it a type|
6 | fn compute(a: TypeName, b) -> u32 {|             ++++++++++
help: if this is a type, explicitly ignore the parameter name|
6 | fn compute(_: a, b) -> u32 {|            ++error: expected one of `:`, `@`, or `|`, found `)`--> exercises/01_intro/01_syntax/src/lib.rs:6:16|
6 | fn compute(a, b) -> u32 {|                ^ expected one of `:`, `@`, or `|`|= note: anonymous parameters are removed in the 2018 edition (see RFC 1685)
help: if this is a parameter name, give it a type|
6 | fn compute(a, b: TypeName) -> u32 {|                ++++++++++
help: if this is a type, explicitly ignore the parameter name|
6 | fn compute(a, _: b) -> u32 {|               ++error: could not compile `syntax` (lib) due to 2 previous errors
error: could not compile `syntax` (lib test) due to 2 previous errors

一开始可能会被长长的错误信息压倒,但这些错误并不是随便给出的,而是大多提供了便于查找的错误信息。所以如果认真阅读,能学到很多东西。

虽然显示了两个错误,但它们几乎是相同的。

error: expected one of `:`, `@`, or `|`, found `,`--> exercises/01_intro/01_syntax/src/lib.rs:6:13|
6 | fn compute(a, b) -> u32 {|             ^ expected one of `:`, `@`, or `|`|= note: anonymous parameters are removed in the 2018 edition (see RFC 1685)

由于是语法问题,因此出现了与语法相关的错误。就像在做“理所当然体操”一样。

在错误信息下面有三条帮助提示,它们似乎根据我们的意图进行了分类。

  • 如果是 self 类型,请加上 self
  • self 是定义方法时的语法糖,这次不适用。
  • 如果是指参数(参数名),请写上类型。
  • 如果是指类型名,请加上参数名。 (虽然并没有这样直接写,而是提示使用 _ 来表示未使用的参数。)

这次的错误可能与第二点或第三点有关,即“应该同时明确写出参数名和类型,但只写了其中之一”。

在绑定变量时可以省略类型名(后面会详细说明,但必须静态确定),不过由于Rust是静态类型语言,所以在函数签名中特别需要明确指定类型。

解说

我们回到问题所在的部分。ab 是以小写字母开头的标识符。在Rust中,变量名通常采用蛇形命名法(snake_case),而类型名和特征名则采用帕斯卡命名法(PascalCase),因此这些标识符应该是变量名。

因此,我们需要为它们添加类型名。由于Rust不会进行隐式类型转换,为了最小化修改(也就是遵循“不要触碰函数体”的原则),将它们设为 u32 类型似乎是最合适的选择。

- fn compute(a, b) -> u32 {+ fn compute(a: u32, b: u32) -> u32 {// Don't touch the function body.a + b * 2
}

成功通过了!让我们继续下一个问题。

(按顺序的话应该是 02_basic_calculator/00_intro,不过看起来只是做个标题调用,所以我们跳过它。后面的章节似乎也是类似的情况。)

[02_basic_calculator/01_integers] 整数型

  • 2.1. Integers

问题如下: 

fn compute(a: u32, b: u32) -> u32 {// TODO: change the line below to fix the compiler error and make the tests pass.a + b * 4u8
}#[cfg(test)]
mod tests {use crate::compute;#[test]fn case() {assert_eq!(compute(1, 2), 9);}
}

虽然与刚才的问题类似,但这次更强调了 没有隐式类型转换 这一点。

解说

4u8 是一个表示 u8 类型的数字 4 的字面量。由于不会进行隐式类型转换,如果一开始就将其设定为 u32 类型的 4,效果会更好。

fn compute(a: u32, b: u32) -> u32 {// TODO: change the line below to fix the compiler error and make the tests pass.-    a + b * 4u8+    a + b * 4u32}

u32u8 中的 u 代表无符号整数(unsigned integer),i32i8 中的 i 代表整数(integer)。在Rust中,为了防止出现错误,通常在不需要表示负数时会使用无符号整数。

虽然有很多关于二进制补码和字节宽度的讨论,但最终我们会关心“最大值和最小值到底是多少?” 这些值可以通过 MINMAX 方法来确认。

  • i32::MIN ( = -2147483648 )
  • u32::MAX ( = 4294967295 )

此外,虽然在本节中尚未提及,但 usize 可能是你最常见到的整数类型。之所以如此,是因为这个整数类型非常特殊,它可以用于数组的索引。换句话说,usize 是一种接近地址值的类型。在32位操作系统中,它是32位宽;在64位操作系统中,它是64位宽,因此被赋予了“size”这个名称。

[02_basic_calculator/02_variables] 变量

  • 2.2. Variables

问题如下: 

pub fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {// TODO: define a variable named `distance` with the right value to get tests to pass//  Do you need to annotate the type of `distance`? Why or why not?// Don't change the line belowdistance / time_elapsed
}#[cfg(test)]
mod tests {use crate::speed;#[test]fn case1() {assert_eq!(speed(0, 10, 10), 1);}#[test]fn case2() {assert_eq!(speed(10, 30, 10), 2);}#[test]fn case3() {assert_eq!(speed(10, 31, 10), 2);}
}

提示内容是:distance 变量尚未定义,请定义它。

解说

通过用终点坐标减去起点坐标可以得到距离,因此可以将其绑定为 distance 变量。

pub fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {// TODO: define a variable named `distance` with the right value to get tests to pass//  Do you need to annotate the type of `distance`? Why or why not?+    let distance = end - start;// Don't change the line belowdistance / time_elapsed
}

从练习的意图来看,似乎是想引导你思考:“既然是强类型静态语言,为什么不需要为 distance 指定类型(比如写作 let distance: u32 = ...)呢?” 其实,Rust具有相当强大的类型推断机制,如果可以从相关的运算等推断出类型,就不会出现错误。

另外,VSCode 的 rust-analyzer插件还具有一个功能,即“当类型可以被推断时,会以灰色显示该类型”。

“Rust一开始有点难上手,但自从 rust-analyzer 能帮忙添加类型注释后,就变得容易多了,” 这是我朋友说的。而实际上,这个功能确实使得Rust既易于编写又保持对类型的严格要求,同时也让 VSCode + rust-analyzer 成为了最好的Rust编辑器组合。

总结

最后一个问题很有特点,通过这三道题我们了解到:

  • 函数的签名必须由人手动指定。
  • 作为一种强类型静态语言,显然不允许隐式类型转换。
  • 由于类型推断机制,变量的类型注释在一定程度上可以省略。

这表明,Rust并不是要求在所有地方都必须进行类型注释,而是在需要的地方,比如函数签名,才需要人手动进行类型注释。正因为这一特点,笔者认为,Rust的类型系统相比其他语言更容易上手。

下一篇文章: 【2】if・panic・练习

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

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

相关文章

Java:接口interface

文章目录 接口interface好处为什么要用接口 接口案例需求思路代码Student.javaClassManage.javaStudentOperator 接口StudentOperatorImpl1.javaStudentOperatorImpl2.javaTest.java 黑马程序员学习笔记 接口interface 接口中:变量默认为常量,方法默认为…

全网最详细HAProxy入门小知识

目录 一. 负载均衡 负载均衡的意义: 负载均衡的类型: 二. HAProxy 简介 HAProxy 的特点: 社区版和企业版: 三. HAProxy 的安装和服务信息 1、实验环境 1)安装并配置 Nginx 2)在客户端测试 2、安装…

使用C语言构建Lua库

Lua 本身是用 C 语言编写的,因此使用 C 编写扩展可以更好地与 Lua 引擎集成,减少性能瓶颈,同时C 语言提供了对底层硬件和操作系统功能的直接访问能力,让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非…

大语言模型的模型量化(INT8/INT4)技术

目录 一、LLM.in8 的量化方案 1.1 模型量化的动机和原理1.2 LLM.int8 量化的精度和性能1.3 LLM.int8 量化的实践 二、SmoothQuant 量化方案 2.1 SmoothQuant 的基本原理2.2 SmoothQuant 的实践 三、GPTQ 量化训练方案 3.1 GPTQ 的基本原理3.2 GPTQ 的实践 参考资料 一、LLM.i…

SD-WAN企业组网:与传统组网有何不同?

很多企业已经尝试过使用SD-WAN来进行组网。SD-WAN代表着一种新兴的网络连接技术,与传统的网络架构相比,它在许多方面都有明显的不同。 SD-WAN基于软件定义网络(SDN)的概念,提供集中化的网络控制和智能优化,…

macos重装系统 启动U盘制作方法 - createinstallmedia 命令使用方法总结

macos重装系统比windows要稍微复杂一些,不过还好,macos系统安装app这个Apple官方提供的系统软件里面默认就内置了一个可用为我们制作启动盘的工具 createinstallmedia 我们下载的apple安装镜像要门是 dmg/pkg/iso 的压缩档案格式的,要么是 x…

电子行业数字工厂管理系统解决方案

电子行业数字工厂管理系统解决方案是针对电子企业特定需求而设计的一套综合管理系统,旨在通过数字化手段提升生产效率、优化资源配置、降低运营成本,并确保高品质产品的输出。以下是一个详细的电子行业数字工厂管理系统解决方案的概述: 一、系…

WebAssembly最详教程

WebAssembly 是一种新的编码方式,可以在现代的 Web 浏览器中运行——它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C、C# 和 Rust 等语言提供编译目标,以便它们可以在 Web 上运行…

面试 | Python 自动化测试技术面试真题

本文为面试某公司测试开发/自动化测试工程师时的面试题笔记。 全部笔试内容没有全部写全,只贴通用性的技术相关的笔试面试题,至于测试理论和团队管理的问题,都是大同小异,也没什么实际的参考价值。 1.直接手写一个 P…

AWS云服务器选择最佳区域

2024年,随着全球云计算的持续发展和AWS在全球不断扩展的数据中心网络,选择合适的AWS云服务器区域成为了企业和开发者需要认真考虑的问题。九河云告诉你在做出选择之前,需要考虑以哪些关键因素: 地理位置和用户分布 选择AWS云服务…

ZAN与Mysten Labs合作推进Web3基础设施开发

Mysten Labs是一家Web3基础设施公司,也是Sui区块链的开发公司,今天宣布与蚂蚁数字科技的技术品牌ZAN建立合作伙伴关系。 通过整合Sui,ZAN旨在加速其Web3应用程序的开发和采用。该合作将专注于为Mysten Labs在两个关键领域提供技术支持&#…

分班查询一键发布,老师们都在用

新学期的钟声即将敲响,校园里又将迎来一批充满好奇和期待的新生。对于老师们来说,这不仅仅是一个新起点,更是一项挑战——如何高效而准确地将新生的分班信息传达给每一位家长。传统的方法是通过私信逐一发送,这不仅耗时耗力&#…

opencv-python图像增强二:图像去雾(暗通道去雾)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、简介:二、暗通道去雾方案简述:三、算法实现步骤3.1最小值滤波3.2 引导滤波3.3 计算图像全局光强 四:整体代码实现五&#xf…

加密软件有哪些常见的安全特性

1. 数据加密 核心功能:加密软件的核心在于对数据进行加密处理,通过复杂的加密算法(如AES、RSA等)将明文数据转换为密文,确保数据在存储和传输过程中的安全性。 透明加密:部分加密软件支持透明加密功能&am…

代码+视频,R语言VRPM绘制多种模型的彩色列线图

列线图,又称诺莫图(Nomogram),它是建立在回归分析的基础上,使用多个临床指标或者生物属性,然后采用带有分数高低的线段,从而达到设置的目的:基于多个变量的值预测一定的临床结局或者…

排队免单小程序

本文来自:排队免单小程序 - 源码1688 应用介绍 排队免单小程序是基于移动互联网技术开发的平台系统,通过小程序的形式为消费者和商家搭建了一个互动桥梁。以下是对排队免单小程序的详细介绍: 一、基本概念 排队免单小程序是一种创新的营销工…

拯救打工人的4款可ai生成ppt神器大PK,谁是加班狗的最爱?

在忙碌的工作日常里,做PPT常常让不少上班族头疼。晚上加班时,办公室里总能看到那些为了做出完美PPT而熬夜的人。不过现在好了,科技进步带来了好消息,有几款AI生成PPT的神器出现了,今天,咱们就来比一比&…

c++41两头堵模型

直接拷到自己的内存空间 字符串反转 递归:参数的入栈模型 函数的调用模型 先被调用的模型后执行 向局部变量拷贝内存 传两个参数 做函数结果

华为od统一考试B卷【AI面板识别】python实现

思路 n int(input())class Light:def __init__(self, id, x1, y1, x2, y2):self.id idself.x1 x1self.y1 y1self.x2 x2self.y2 y2self.height y2 - y1def get_lights_info(n):lights []for _ in range(n):id, x1, y1, x2, y2 map(int, input().strip().split())lights…

乡村振兴旅游休闲景观解决方案

乡村振兴旅游休闲景观解决方案摘要 2. 规划方案概览 规划核心:PPT展示了乡村振兴建设规划的核心区平面图及鸟瞰图,涵盖景观小品、设施农业、自行车道、新社区等设计元素。 规划策略:方案注重打造大开大合的空间感受,特色农产大观…