一般在 C/Cpp 中, 假設咱們用一個指針指向一塊申請的內存區域函數
char *p = (char *) malloc(50);
複製代碼
假設這個 p
攜帶了數據, 恰好有個函數須要使用到 p
攜帶的數據, 那麼就像這樣ui
#include <stdio.h>
#include <string.h>
void foo(char *p) {
*p = NULL;
}
int main(int argc, char **argv) {
char *p = (char *) malloc(50);
strcpy(p, "test");
printf("%s\n", p);
foo(p);
printf("%s\n", p);
return 0;
}
複製代碼
foo
你不看函數實現根本不曉得內部會作什麼事, 是否進行了 free
操做等等. 就像這裏, 函數內部把指針設成 NULL
, 你外部也不曉得.
Rust 經過引入一個 ownership 的概念來解決此類問題.spa
咱們能夠定義一個變量來理解.指針
let a = String::from("test");
複製代碼
通常咱們都會講給變量 a
賦一個 String
類型的值, 可是 Rust 裏的說法是, 給 a
綁定一個 String
類型的值, 爲何要這麼講嘞.
首先綁定就是當前狀況下, String
類型的這個值, 只有 a
這一個管理者, 因此 a
就是值的全部者, a
離開當前的做用域, a
就被處理掉, 包括它所管理的值. 這就是 ownership 的概念.code
而後就是 move
, 這個概念很好理解, 就是變量的 ownership
轉移的行爲. 咱們的變量 a
如今擁有了它的值的全部權, 要是綁定的時候再加個 mut
, 還能改變值. 我要是再把它綁定給其餘的變量, 天然也是能夠的, 可是同時得把關於這個值的 ownership
交出來.ip
let mut a = String::from("test");
a = String::from("foo");
a.push_str("bar");
println!("{}", a);
let b = a;
複製代碼
如今, 咱們的 a
已經無法用了, 也就是 a
的 ownership
已經 move
給 b
了. 有一點要搞清爽的就是, 起初 a
是 String
類型值的全部者, 可是當權力變動的時候, a
就沒了, 而 String
類型的值直接轉交給了 b
.內存
fn main() {
let a = foo();
bar(a);
}
fn bar(s: String) {
println!("{}", s);
}
fn foo() -> String {
let a = String::from("bar");
a
}
複製代碼
這些函數傳參, 返回值都會發生 move
.作用域
好吧, 此次我不會管挖無論埋了, 好好寫完這一系列.string