Rust-所有权(二)

所有权与函式

将一个变数当作函式的参数传给其他函式,怎样安全的处理所有权

传递数值给函式这样的语义和赋值给变数是类似的。传递变数给函式会是移动或拷贝就像赋值一样

fn main() {
    // s被宣告
    let s = String::from("hello"); // s进入作用域

    takes_ownership(s); // s的值被当作参数传入函式 所以可以当作s已经被移动,从这开始已经无效

    // x被宣告
    let x = 5; // x进入作用域

    makes_copy(x); // x的值被当作参数传入函式,但x是纯量型别 i32被copy,依然有效
} // 函式结束,x无效,接着是s的值已经被移动了它不会有任何动作

fn takes_ownership(some_string: String) {
    // 一个String参数some_string传入,有效
    println!("{}", some_string);
} // 函式结束,参数some_string占用的记忆体被释放

fn makes_copy(some_integer: i32) {
    // 一个i32参数some_integer传入,有效
    println!("{}", some_integer);
} // 函式结束,参数some_integer是纯量型别,没有任何动作发生

如果在呼叫takes_ownership之後在使用s变数在编译时会出错

回传值与作用域

回传值转移所有权

fn main() {
    let s1 = gives_ownership(); // gives_ownership移动它的回传值给s1
    let s2 = String::from("哈罗"); // s2进入作用域
    let s3 = takes_and_gives_back(s2); // s2移入takes_and_gives_back,该函式又将其回传值移到s3
} // s3 在此离开作用域并释放
  // s2 已被移走,所以没有任何动作发生
  // s1 离开作用域并释放

// 此函式回传一个String
fn gives_ownership() -> String {
    let some_string = String::from("hello"); // some_string进入作用域

    return some_string; // 回传some_string并移动给呼叫它的函式
}

// 此函式会取得一个String然後回传它
fn takes_and_gives_back(a_string: String) -> String {
    // a_string进入作用域
    return a_string; // 回传a_string并移动给呼叫的函式
}

引用与借用在前面介绍定义函式时有介绍过了,这边就不多讲了

讲一下迷途指标(dangling pointer),这个在很多指标语言常发生的错误

简单讲就是用到空指标,Rust会在编译时检查这类型的错误

例如

fn dangle() -> &String { // 回传String的迷途引用
    let s = String::from("hello"); // 宣告一个新的String
    return &s // 回传String的引用
} // s在此会离开作用域并释放

编译时会产生错误 missing lifetime specifier

这个有关於生命周期的会在下一篇讲


<<:  [面试][後端]在正式 API 完成前,如何让要串接的工程师不要空等?

>>:  前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day30 社群网站上线啦!

Golang快速入门-5(Day8)

export/unexport(private/public) 在golang中,如果要实现priv...

Day 15 Platform module

15 天了,没想到过半了,再接再厉~~ 讲了几天的 React , 现在让我们把焦点拉回 React...

建立第一个RESTful api server(连结资料库篇)-2 (Day18)

那在接下来的内容中,会说明将gorm接上postgreSQL的过程 https://www.yout...

Day07 - Docker 101 容器操作篇

前言 Docker 的学习主要可分为容器操作及 Image 建置两部分,今天透过一些简单的 Lab ...

【Day10】 声音转换概述 - 再次出发!

前言 在经过前面 9 天的准备之後,我们终於有些本钱可以涉足这个领域了,整理一下我们现在所掌握的 知...