Rust 变量绑定

数字骑士
• 阅读 2136

变量绑定是指将一些值绑定到一个名字上,这样可以在之后使用他们。Rust 中使用 let 声明一个绑定:

fn main() {
    let x = 123;
}

可变

绑定默认是不可变的(immutable)。下面的代码将不能编译:

let x = 123;
x = 456;

编译器会给出如下错误:

   Compiling hello_world v0.1.0 (yourpath/hello_world)
error[E0384]: re-assignment of immutable variable `x`
 --> main.rs:3:5
  |
2 |     let x = 123;
  |         - first assignment to `x`
3 |     x = 456;
  |     ^^^^^^^ re-assignment of immutable variable

如果想使得绑定是可变的,使用 mut:

let mut x = 123;
x = 456;

如果你声明了一个可变绑定而又没有改变它,虽然可以编译通过,但编译器还是会给出一些建议和警告:

let mut x = 123;
   Compiling hello_world v0.1.0 (yourpath/hello_world)
warning: unused variable: `x`, #[warn(unused_variables)] on by default
 --> main.rs:2:9
  |
2 |     let mut x = 123;
  |         ^^^^^

warning: variable does not need to be mutable, #[warn(unused_mut)] on by default
 --> main.rs:2:9
  |
2 |     let mut x = 123;
  |         ^^^^^

    Finished debug [unoptimized + debuginfo] target(s) in 0.63 secs

这正是 Rust 出于安全的目的。

初始化绑定

Rust 变量绑定有另一个不同于其他语言的方面:绑定要求在可以使用它之前必须初始化。

例如以下代码:

fn main() {
    let x: i32;
    println!("Hello world!");
}

Rust 会警告我们从未使用过这个变量绑定,但是因为我们从未用过它,无害不罚。

  Compiling hello_world v0.1.0 (yourpath/hello_world)
warning: unused variable: `x`, #[warn(unused_variables)] on by default
 --> main.rs:2:9
  |
2 |     let x: i32;
  |         ^

    Finished debug [unoptimized + debuginfo] target(s) in 0.29 secs

然而,如果确实想使用 x, 事情就不一样了。修改代码:

fn main() {
    let x: i32;
    println!("The value of x is: {}", x);
}

这是无法通过编译的:

 Compiling hello_world v0.1.0 (yourpath/hello_world)
error[E0381]: use of possibly uninitialized variable: `x`
 --> main.rs:3:39
  |
3 |     println!("The value of x is: {}", x);
  |                                       ^ use of possibly uninitialized `x`
<std macros>:2:27: 2:58 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
main.rs:3:5: 3:42 note: in this expansion of println! (defined in <std macros>)

error: aborting due to previous error

error: Could not compile `hello_world`.

Rust 不允许我们使用一个未经初始化的绑定。

Mode

在许多语言中,这叫做变量。不过 Rust 的变量绑定有一些不同的巧妙之处。例如 let语句的左侧是一个“模式”,而不仅仅是一个变量。我们也可以这样写:

let (x, y) = (1, 2);

在这个语句被计算后,x 将会是1,'y' 将会是2。也许有人会忍不住说:这不类似于 golang 中的多变量绑定嘛。

var x, y = 1, 2

事实上不是这样的。(1, 2)这种形式是一个元组,是一个固定大小的有序列表。上面的例子还可以写成以下形式:

let n = (1, "hello");
let (x, y) = n;

第一个let将一个元组(1, "hello")绑定到n上,第二个let将元组解构,将元组中的字段绑定到x和y上。

更多模式和元组(Tuple)的特性,将在后续的章节详细介绍。

类型注解

Rust 是一个静态类型语言,意味着我们需要先确定我们需要的类型。事实上,Rust 有一个叫做类型推断的功能,如果它能确认这是什么类型,就不需要明确指定类型。当然也可以显示的标注类型, 类型写在一个冒号':'后面:

let x: i32 = 123;

对于数值类型,也可以这样:

let x = 123i32; // let x: i32 = 123
let y = 123_i32; // let y: i32 = 123
let z = 100_000i32; // let z: i32 = 100000
点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
4年前
uni-app入门教程(3)数据绑定、样式绑定和事件处理
@toc前言本文的内容主要包含3部分:声明并渲染变量,包括条件渲染;通过class和style定义样式并动态绑定;事件的绑定,包含了事件传参。三部分均具有动态绑定的特性。一、模板语法及数据绑定1.声明和渲染变量在使用变量前,需要先声明,一般在data块中进行声明,如hellouniapp项目中index.vue中定义的title变
Stella981 Stella981
3年前
Rust FFI 编程
当我们拥有一组具有良好声明的头文件时,自己定义C库的RustFFI绑定函数是毫无意义的。我们可以使用 bindgen 这种工具从C库的头文件生成RustFFI绑定函数。然后,我们运行一些测试代码以验证其是否正常运行,并对它们进行调整,直到正确为止。本文我们将通过一个示例,讨论如何使用 bindgen 将C库中的函数
Wesley13 Wesley13
3年前
UDT协议实现分析——连接的建立
UDTServer在执行UDT::listen()之后,就可以接受其它节点的连接请求了。这里我们研究一下UDT连接建立的过程。连接的发起来看连接的发起方。如前面我们看到的那样,UDTClient创建一个Socket,可以将该Socket绑定到某个端口,也可以不绑定,然后就可以调用UDT::connect()将这个Socket连接到UD
Wesley13 Wesley13
3年前
SpringMVC 学习系列 (5) 之 数据绑定
在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法。1.@PathVariable用来绑定URL模板变量值,这个我们已经在系列(3)中介绍了使用方法,这里不在赘述。2.@CookieValue用来绑定Cookie中的数据。下面我们用获取Cookie中的sessionId做测试:在
Stella981 Stella981
3年前
Rust学习笔记#2:变量声明、绑定与引用
!(https://oscimg.oschina.net/oscnet/up2a26b061f3ae6214fc3a12b58a2ad0e8433.JPEG)变量声明基础知识Rust中的变量分局部变量和全局变量两种,且必须先声明后使用,常见的声明语法为://声明局部变量,使用let关键字letva
Stella981 Stella981
3年前
Android控件在xml中初始化
一、写在前面界面控件的初始化一般通过findViewByid来查找绑定再强制转换,这项工作只是个纯体力活没有任何营养,一般常用的是使用匿名内部类的方式:首先需要获取到layout中布局页面的Button控件中指定的Id:android:id"";之后为这样按钮绑定监听器,使用匿名内部类的方式,代码如下:
Wesley13 Wesley13
3年前
JQ动态生成节点绑定事件无效问题
最近做项目的时候遇见了一个问题,通过jq将动态节点绑定到dom节点上,并且为动态节点绑定方法,此方法再次为动态节点添加动态节点,但在刷新之后,动态节点上的方法失效了,过程为:创建动态节点动态节点绑定方法添加动态节点刷新后点击动态节点方法失效。<!DOCTYPEhtml<html<head</head<body
Stella981 Stella981
3年前
ES6的let命令(二)
2.暂时性死区暂时性死区(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.51code.com%2F)是指只要块级作用域内存在let命令,它所声明的变量就绑定这个作用域,不会受到外部的影响。       varnum12;    if(true){    nu
Wesley13 Wesley13
3年前
ES 6新语法
一、块级作用域绑定回顾:使用var关键字定义变量定义  声明  赋值; 1. 可以一次定义多个变量 2. 定义时可以只声明不赋值 3. 定义之后可以随时修改变量的值 4. 变量声明会被提升 5. 可重复定义变量 6. 全局定义的变量会被作为全局对象(global/w
Stella981 Stella981
3年前
Rust语言开发基础(六)基础语法
一、变量的定义和使用其它常见的编程语言对变量的定义通常是通过声明类型和使用关键new来创建一个变量,但Rust不是,Rust使用关键字let。1\.变量绑定通过let实现fnmain(){letx5;}2\.变量可以是一种模式,自动匹配。let(x,y)(1,2);3\.
Stella981 Stella981
3年前
Lightning Web Components html_templates(三)
LightningWebComponents强大之处在于模版系统,使用了虚拟dom进行智能高效的组件渲染。使用简单语法以声明方式将组件的模板绑定到组件的JavaScript类中的数据数据绑定我们可以使用{property}绑定组件模版属性到一个组件js类中的属性一个简单的例子组件class
数字骑士
数字骑士
Lv1
其实人世间的挚爱,只有两件事情就可以表达。
文章
4
粉丝
0
获赞
0