Rust编程语言三

Posted Mr -老鬼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust编程语言三相关的知识,希望对你有一定的参考价值。

Rust编程语言三

fn main() 
    // 所有权规则   变量作用域
    // 变量范围是变量的一个属性,其代表变量的可行域,默认从声明变量开始有效直到变量所在域结束。
    // 这里未创建 变量 s 此时 s 不可用
    let s = "abc"; // 这里创建了变量 s 此时 s 可以使用
                   // 这里 变量 s 是可用的
    println!(" s  = ", s);
    my_test_string();
    heap_test();
    move_clone_test();
    ownership_and_functions();
    return_value_and_scope();

// 这里  外面 变量 s 不可用
///
/// String 类型
///
fn my_test_string() 
    //let s = String::from("hello");// 不可变 string 变量
    let mut s = String::from("hello"); // 创建一个可变的string变量
    s.push_str(" word"); // push_str() 在字符串后追加字面值
    println!("my_test >>  s = ", s);


///
/// 内存分配
///
fn heap_test() 
    let num = 1; // 栈内存  创建变量并赋值时 变量有效
    let num2 = 1.1; // 栈内存  创建变量并赋值时 变量有效
    let str1 = "asd"; // 栈内存  创建变量并赋值时 变量有效
    let str2 = String::from("qwe"); // 堆内存  创建变量并赋值时 变量有效
    println!(
        " num = ,num2 = ,str1 = ,str2 = ",
        num, num2, str1, str2
    );

// 上面函数 中的变量全部失效 被自动回收
///
/// 变量的 移动 克隆
///
fn move_clone_test() 
    // 堆内存中的值无法复制只能移动  基本数据类型可以复制
    let a = String::from("abc"); // 创建变量 a 赋值 string 类型 字符串abc
    let b = a; // 将 变量 a 赋值给 b 实际是将变量a的值移动到b , 此时 变量a 失效
    println!("b = ", b);
    //println!("a = ", a); // 此处报错 a 被移动到b时a 失效了
    // clone 克隆
    let s1 = String::from("hello"); // 创建变量s1 赋值 string类型 字符串hello
    let s2 = s1.clone(); // 将 s1的值克隆给s2 此时是克隆所以 s1仍然存在且有效
    println!("s1 = , s2 = ", s1, s2); // 打印 s1 s2值


///
/// 所有权与函数
///
fn ownership_and_functions() 
    let s = String::from("hello"); // s 进入作用域 s 是string类型 存储在堆内存中不能被复制
    takes_ownership(s); // s 的值移动到函数里 ...
                        // ... 所以到这里不再有效
    let x = 5; // x 进入作用域
    makes_copy(x); // x 应该移动函数里,
                   // 但 i32 是 Copy 的,所以在后面可继续使用 x
 // 这里, x 先移出了作用域,然后是 s。但因为 s 的值已被移走,
  // 所以不会有特殊操作
///
/// 移动所有权
///
fn takes_ownership(some_string: String) 
    // some_string 进入作用域
    println!("", some_string);
 // 这里,some_string 移出作用域并调用 `drop` 方法。占用的内存被释放
///
/// 复制
///
fn makes_copy(some_integer: i32) 
    // some_integer 进入作用域
    println!("", some_integer);
 // 这里,some_integer 移出作用域。不会有特殊操作
///
/// 返回值与作用域
///
fn return_value_and_scope() 
    let s1 = gives_ownership(); // gives_ownership 将返回值
                                // 移给 s1

    let s2 = String::from("hello"); // s2 进入作用域

    let s3 = takes_and_gives_back(s2); // s2 被移动到
                                       // takes_and_gives_back 中,
                                       // 它也将返回值移给 s3
    println!("s3 = ", s3);
 // 这里, s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走,
  // 所以什么也不会发生。s1 移出作用域并被丢弃

fn gives_ownership() -> String 
    // gives_ownership 将返回值移动给
    // 调用它的函数
    let some_string = String::from("hello"); // some_string 进入作用域.
    some_string // 返回 some_string 并移出给调用的函数


// takes_and_gives_back 将传入字符串并返回该值
fn takes_and_gives_back(a_string: String) -> String 
    // a_string 进入作用域
    a_string // 返回 a_string 并移出给调用的函数

输出

 s  = abc
my_test >>  s = hello word
 num = 1,num2 = 1.1,str1 = asd,str2 = qwe
b = abc
s1 = hello, s2 = hello
hello
5
s3 = hello

进程已结束,退出代码为 0


我是Mr-老鬼、QQ1156346325 。交流QQ群:620028786,647082990,772810035
————————————————版权声明——————————————————
本文版权所有~Mr-老鬼 ~转载请注明原文地址
免责声明:本文所有的教程仅限交流学习使用不得用于违法用途,造成的法律后果本人不承担责任。

以上是关于Rust编程语言三的主要内容,如果未能解决你的问题,请参考以下文章

用欧拉计划学Rust编程(第61题)

腐蚀rust 配置要求

日常Geetest滑动验证码(三代canvas版)处理小结(以B站登录验证为例)

[从零开始学习FPGA编程-47]:视野篇 - 第三代半导体技术现状与发展趋势

什么是 Java 字节码?采用字节码的好处是什么?

Rust 编程语言〇