Rust 学习笔记 - 变量声明与使用

这篇具有很好参考价值的文章主要介绍了Rust 学习笔记 - 变量声明与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。

变量介绍

Rust 是一种强类型语言,但在声明变量时,不总是需要显式声明类型,这是因为 Rust 的编译器有类型推断系统。当声明一个变量而没有指定类型时,Rust 编译器会根据变量的初始值自动推断出它的类型。

在强类型语言中,每个变量和常量都必须有一个明确的类型,而且类型在编译时就已经确定。Rust 编译器非常严格,不允许不同类型的数据隐式转换。如果需要将一个类型转换为另一个类型,必须使用明确的类型转换方法。这一特性使得 Rust 在编译时能够提供类型检查,有助于避免许多常见的运行时错误。

不可变变量 (Immutable)

与其他编程语言(如:Java、Python、JS)不同,默认情况下 Rust 中的变量是不可变的 (神奇,变量不可变🤔)。

这一特性意味着变量一旦被赋值后,在变量的整个生命周期内它的值就不能被改变,尝试修改一个不可变变量的值会导致编译时错误。

示例:

let x = 5;
x = 6; // 这会导致编译错误,因为 x 是不可变的

可变变量 (Mutable)

  • 通过使用 mut 关键字,可以声明一个可变的变量,这样的变量允许其值在后续被修改。
  • 但需要注意,rust 作为强类型语言,修改变量时不允许赋值其他类型的值

示例:

let mut x = 5;
x = 6; // 这是允许的,因为 x 是可变的

// error[E0308]: mismatched types
x = 3.1415926; // 3.1415926 是浮点数,x 声明时是整形

变量遮蔽(Shadowing)

变量遮蔽是 Rust 中的一个特性,有些文档或教程将 Shadowing 称为:隐藏重影,它允许在相同作用域中,使用相同的名称声明一个新变量。这个新声明的变量“遮蔽”了先前声明的同名变量。更准确地说,当新变量被引入时,它会使得与之同名的先前变量不再可见,直到新变量离开作用域前,无法访问被遮蔽的变量。这与变量重新赋值不同,因为它实际上是在创建一个全新的变量。

遮蔽的好处是可以重新使用更有意义或适用于当前上下文的变量名,遮蔽通常用于转换值的类型或给变量一个新值,而这样做并不影响原来变量的不可变性。

示例1:

let x = 5;
let x = x + 1; // 遮蔽前一个 x 变量
let x = "现在 x 是一个字符串"; // 再次遮蔽,改变了值的类型

示例2:

fn main() {
    let x = 5;
    let x = x + 1;

    {
	    // 在使用花括号创建的内部作用域内,变量 `x` 被遮蔽
        let x = x * 2;
        println!("x 在当前作用域的值是: {x}"); // 12
    }
	// 当作用域结束后,内部 shadowing 的作用域也结束了,`x` 又返回到 `6`
    println!("x 在当前作用域的值是: {x}"); // 6
}

常量 (Constants)

  • 常量使用 const 关键字声明,并且它们总是不可变的。
  • 常量必须在声明时就赋值,而且它们的类型必须显式声明。
  • 常量名应该全部大写,否则会报警告。

示例:

const MAX_POINT: u32 = 100_000;

不可变变量 与 常量的区别

在 Rust 中,虽然不可变变量和常量都不能在声明后被修改,但它们之间存在几个主要区别:

类型标注

  • 声明常量时,必须显式给出类型标注
  • 不可变变量通常可以依赖 Rust 的类型推断,类型标注是可选的。

示例:

// ok!
let x = 1000;
// error: missing type for `const` item
const CONST_VAL = 1000; 

值的赋予时机

  • 常量在编译时被赋值,且必须是一个恒定的表达式,不能是运行时的结果。
  • 不可变变量可以在运行时被初始化,其中的值可以是在运行时才能确定的表达式的结果。

示例1:

fn get_val() -> i32 {
    1000
}

fn main() {
	// ok!
    let x = get_val(); 
    // const 不能接收运行时的结果
    // error[E0015]: cannot call non-const fn `get_val` in constants
    const CONST_VAL: i32 = get_val(); 
}

示例2:

fn main() {
	// let 允许先声明,后赋值
    let x;
    x = 1000; 

	// error: free constant item without body
	const CONST_VAL: i32; 
	// error[E0070]: invalid left-hand side of assignment
	CONST_VAL = 1000;
}

变量遮蔽

  • 不可变变量可以通过变量遮蔽进行重新赋值
  • 常量无法进行变量遮蔽,相同常量名重复定义时会报错

示例:

    let x = 1000;
     // ok!
    let x = "str";

    const CONST_VAL: i32 = 1000;
    //  // error[E0428]: the name `CONST_VAL` is defined multiple times
    const CONST_VAL: &str = "str";

作用域

  • let 关键字用于在局部作用域中声明变量,如函数或代码块内部,而不能用于全局作用域。
  • const 关键字可以用于全局作用域中声明常量,也可以在局部作用域中使用。

示例:

const GLOBAL_CONST: i32 = 10; // 全局常量,可以在整个程序中访问

// error: expected item, found keyword `let`
// let x = 1000; // 不允许声明全局变量
fn main() {
    let local_var = 5; // 局部变量,只能在 main 函数内访问
    println!("常量: {}", GLOBAL_CONST);
    println!("局部变量: {}", local_var);
}

fn another_function() {
    // local_var 在这里是不可见的,因为它不在作用域内
    // GLOBAL_CONST 仍然是可见的
    println!("同一个常量: {}", GLOBAL_CONST);
}

结语

本文深入介绍了 Rust 中的变量声明,特别是它独有的不可变变量变量遮蔽特性。相较于其它编程语言,这些概念初看可能会给变量操作带来复杂性。然而,随着使用的深入,这些概念将变得清晰明了,你将发现它们实际上是 Rust 强大功能和安全性的体现,而且并不复杂。文章来源地址https://www.toymoban.com/news/detail-827670.html

到了这里,关于Rust 学习笔记 - 变量声明与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust中的宏:声明宏和过程宏

    宏是Rust语言中的一个重要特性,它允许开发人员编写可重用的代码,以便在编译时扩展和生成新的代码。宏可以帮助开发人员减少重复代码,并提高代码的可读性和可维护性。Rust中有两种类型的宏:声明宏和过程宏。 声明宏是一种用于定义新的宏的语法。它使用 macro_rules

    2023年04月22日
    浏览(34)
  • Rust 学习笔记(持续更新中…)

    运行 Rust 程序之前必须先编译,命令为: rustc 源文件名  - rustc main.rs 编译成功之后,会生成一个二进制文件 - 在 Windows 上还会生产一个 .pdb 文件  ,里面包含调试信息 Rust 是 ahead-of-time 编译的语言 - 可以先编译程序,然后把可执行文件交给别人运行(无需安装 Rust ) rustc

    2024年02月10日
    浏览(86)
  • Rust 学习笔记 - 注释全解

    和其他编程语言一样,Rust 也提供了代码注释的功能,注释用于解释代码的作用和目的,帮助开发者理解代码的行为,编译器在编译时会忽略它们。 单行注释以两个斜杠 ( // ) 开始,只影响它们后面直到行末的内容。单行注释通常用于对代码行或代码块的短小说明。 多行注释

    2024年02月19日
    浏览(41)
  • Rust学习笔记005:结构体 struct

            在 Rust 中, struct 是一种用于创建自定义数据类型的,它允许你定义和组织数据的结构。 struct 可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。         下面是一个简单的例子,展示了如何定义和使用 struct : 元组结构体(

    2024年02月03日
    浏览(39)
  • Rust 学习笔记 - 流程控制 与 Range 类型

    任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。 if 语句在其他语言中很常见,这里不再多做解释,看注释即可。 if  表达式也支持 if...else if...else 语句

    2024年02月20日
    浏览(38)
  • Rust教程:How to Rust-变量

    本文为第1篇 本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议完全无计算机基础的同学 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用: 操作系统macOS Sonoma 14 / Apple M1 编译器:Rustc Cargo 感谢一路相伴的朋友们,感谢你们的支持

    2024年03月15日
    浏览(51)
  • Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用

    Rust 笔记 Rust 语言中映射(HashMap)与集合(HashSet)及其用法 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/130876735 【介绍】:本文介绍 Rust 中哈希结构相关概念及其使用。在 R

    2024年02月09日
    浏览(53)
  • 【Rust】Rust学习 第五章使用结构体组织相关联的数据

    定义结构体,需要使用  struct  并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为  字段 ( field )。 实例化(不可变变量) 可变变量 字段初始化简写语法 通过已经存着的变

    2024年02月13日
    浏览(48)
  • 【Rust 基础篇】Rust可变静态变量:全局状态的可变性管理

    Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了\\\"所有权系统\\\"、\\\"借用检查器\\\"等特性,有效地避免了常见的内存安全问题。然而,有时候我们需要在程序的整个生命周期

    2024年02月15日
    浏览(36)
  • Rust-变量

    Rust的变量必须先声明后使用。对于局部变量,最常见的声明语法为: 与传统的C/C++语言相比,Rust的变量声明语法不同。这样设计主要有以下几个方面的考虑。 语法分析更容易 从语法分析的角度来说,Rust的变量声明语法比C/C++语言的简单,局部变量声明一定是以let开头

    2024年01月21日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包