边做边学Rust之变量绑定

原创 2015年11月19日 09:22:53

4 变量绑定

Rust通过静态类型实现类型安全。变量绑定可以在定义时注明类型。然而在大多数情况下,编译器可以从上下文环境中推断出变量类型,大大的减轻了注解的负担。


使用let,可以将值(例如literals)绑定到变量。

fn main() {
    let an_integer = 1u32;
    let a_boolean = true;
    let unit = ();

    // copy `an_integer` into `copied_integer`
    let copied_integer = an_integer;

    println!("An integer: {:?}", copied_integer);
    println!("A boolean: {:?}", a_boolean);
    println!("Meet the unit value: {:?}", unit);

    // The compiler warns about unused variable bindings; these warnings can
    // be silenced by prefixing the variable name with an underscore
    let _unused_variable = 3u32;

    let noisy_unused_variable = 2u32;
    // FIXME ^ Prefix with an underscore to suppress the warning
}

程序运行结果:


An integer: 1
A boolean: true
Meet the unit value: ()

4.1 可变性


变量绑定默认是不可变的,但是可以使用mut关键字覆盖:


fn main() {
    let _immutable_binding = 1;
    let mut mutable_binding = 1;

    println!("Before mutation: {}", mutable_binding);

    // Ok
    mutable_binding += 1;

    println!("After mutation: {}", mutable_binding);

    // Error!
    //_immutable_binding += 1;
    // FIXME ^ Comment out this line
}

程序执行结果:


Before mutation: 1
After mutation: 2

4.2 作用于和覆盖


变量绑定有一个作用域,被限制在一个块中。块是一个被{}包括的集合。并且允许变量覆盖。

fn main() {
    // This binding lives in the main function
    let long_lived_binding = 1;

    // This is a block, and has a smaller scope than the main function
    {
        // This binding only exists in this block
        let short_lived_binding = 2;

        println!("inner short: {}", short_lived_binding);

        // This binding *shadows* the outer one
        let long_lived_binding = 5_f32;

        println!("inner long: {}", long_lived_binding);
    }
    // End of the block

    // Error! `short_lived_binding` doesn't exist in this scope
    //println!("outer short: {}", short_lived_binding);
    // FIXME ^ Comment out this line

    println!("outer long: {}", long_lived_binding);

    // This binding also *shadows* the previous binding
    let long_lived_binding = 'a';

    println!("outer long: {}", long_lived_binding);
}

程序运行结果:


inner short: 2
inner long: 5
outer long: 1
outer long: a

4.3 声明在先


可以先声明变量绑定,后初始化。然而这种形式很少使用,因为它可能导致使用未初始化的变量。

fn main() {
    // Declare a variable binding
    let a_binding;

    {
        let x = 2;

        // Initialize the binding
        a_binding = x * x;
    }

    println!("a binding: {}", a_binding);

    let another_binding;

    // Error! Use of uninitialized binding
    //println!("another binding: {}", another_binding);
    // FIXME ^ Comment out this line

    another_binding = 1;

    println!("another binding: {}", another_binding);
}

程序运行结果:
a binding: 4
another binding: 1

编译器禁止使用未初始化的变量,因为这可能导致未定义的操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

边做边学Rust之Hello World

1. Hello World 这是一个传统Hello World程序的源码: // This is a comment, and will be ignored by the compiler...
  • cnxxrj
  • cnxxrj
  • 2015年11月16日 08:45
  • 1375

边做边学Rust之用户自定义类型

3 用户自定义类型 Rust自定义类型主要通过下面两个关键进行定义: struct:定义一个结构enum:定义一个枚举 常量能以通过const和static关键字创建。 3.1 结构 ...
  • cnxxrj
  • cnxxrj
  • 2015年11月18日 09:23
  • 1217

【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用。这次要做设置向导界面的功能具体实现。...
  • bruce_6
  • bruce_6
  • 2014年12月30日 13:28
  • 1262

Grails边做边学入门篇[0]--------讲讲什么是Grails

以前博客里面写过几篇关于Grails的文章,那时我刚刚接触Grails,但是由于个人比较懒,所以没有把那个系列的博客坚持写下来,现在打算重新写一下,毕竟自己接触了一段时间,也有了些真正的体会。在这里介...

Python 边做边学 8.2 工具类--配置文件工具(CfgUtil)

搜索使用Python3读取配置文件 CfgUtilpy 代码 confini 代码 简单描述 其他

边做边学Python Flask Web开发(3)-- Flask Hello World!

由于本系列教程叫做“边做边学”,因此我们在后续的讲解会以实践为主,穿插着介绍基本概念。请大家有条件的话跟着我们一起上机实践,而不要过于纠结深层次的原理,这些我们会在后续的教程中为大家慢慢解释。安装Fl...
  • langkew
  • langkew
  • 2016年06月06日 13:35
  • 1599

【leetcode边做边学】二分查找应用

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素...

Python 边做边学 3 网页分析

简单分析一下这个页面,看我们能获取到什么信息;

【边做项目边学Android】手机安全卫士05_2:程序主界面,为每个条目添加事件

为每个条目添加点击事件监听器 gv_main.setOnItemClickListener(this); 需要当前Activity实现OnItemClickListener接口,同时实现publi...
  • bruce_6
  • bruce_6
  • 2014年11月04日 15:33
  • 1129

【边做项目边学Android】知识点:动态设置布局LayoutInflater

一.作用:     LayoutInflater作用是将layout的xml布局文件实例化为View类对象,LayoutInflater 的作用类似于 findViewById(),不同点是Layou...
  • bruce_6
  • bruce_6
  • 2014年11月04日 15:47
  • 1460
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:边做边学Rust之变量绑定
举报原因:
原因补充:

(最多只允许输入30个字)