成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

千萬別學Rust!

開發(fā) 前端
張大胖原來用過C語言, 當時覺得非常不爽的是它本身沒有內置常用的數據結構,比如一個可以動態(tài)增長的數組,這Rust怎么樣呢?

張大胖被別人安利了一個新的語言:Rust,說是將來會替代C語言,就連Linux都要使用Rust了。

作為編程語言的狂熱愛好者,他自然要嘗試一番。 

第一個程序自然是hello world,太簡單了,都懶得去寫,看看就行了:

fn main() {
   println!("hello world");
}

張大胖原來用過C語言, 當時覺得非常不爽的是它本身沒有內置常用的數據結構,比如一個可以動態(tài)增長的數組,這Rust怎么樣呢?

fn main() {
    let v = Vec::new(); //創(chuàng)建了一個數組
    v.push(4);  // 向數組添加一個元素
}

張大胖寫下let就意識到,這里是將值(數組)綁定到變量v , 應該是借鑒了Lisp的模式匹配,可以預見將來會遇到這樣的代碼: 

let (name,age) = ("Andy", 30);

還有就是這Rust具備自動類型推斷能力,這點挺不錯的。 

編譯吧!咦,居然失敗了,錯誤信息是:cannot borrow `v` as mutable, as it is not declared as mutable

Rust編譯器:我們把對象分為可變的和不可變的,對于不可變的,一旦創(chuàng)建以后,就不能再改了。那就加個關鍵字mut,讓它變成可變的就可以了:let mut v = Vec::new()

張大胖想起了《effective java》中的一條實踐:把可變性限制到最小。他嘴里咕噥著:“嗯,Rust默認是不可變,這個思路也許是對的。”

所有權

他又探索著寫下一些代碼:

fn main() {
    //用另外一種方式創(chuàng)建了一個可變Vector 
    let mut v = vec![1,2];   
    let v1 = v;
    println!(" the 1st element is {}",v[0]);    
}

編譯,又失敗了,WTF!到底是怎么回事?這么簡單的程序也會出錯?!

Rust編譯器:誰讓你手賤!加了一行代碼:let v1 = v

張大胖:這有什么關系?在Java中,這就相當于對同一個對象,又添加了一個引用而已!

Rust編譯器:那是Java,在我Rust這里,你一定要放下Java的執(zhí)念!要理解一下所有權的問題。

張大胖:什么所有權?

Rust編譯器:對于任何給定的對象都只有一個綁定與之對應。你用let mut v = Vec::new()就意味著 v 和這個Vector對象綁定了!現在v擁有這個對象的所有權。這一行代碼 let v1 = v ,讓所有權發(fā)生轉移了, 現在v1是新主人了。v就不能再訪問這個Vector, 我把這種情況叫做“轉移語義”。

圖片圖片

碼農翻身注:實際上, Rust也支持Copy語義,這里不在詳述。

張大胖不滿地說:這不是徒增煩惱嗎?那我要是把v傳遞給另外一個函數呢?

fn main() {
    let mut v = vec![1,2,3,4]; //創(chuàng)建了一個可變Vector
    print_vector(v);
    println!(" the 1st element is {}",v[0]);

}
fn print_vector(v: Vec<i32>){
    for i in v {
        println!("{}", i);
    }
}

編譯還是出錯!

Rust編譯器:這和剛才是一個道理,v的所有權在傳遞給函數時,被拿走了,所以在main中不能再訪問v了 ! 

借用

張大胖:太變態(tài)了,我就是想在調用print_vector以后想訪問再訪問變量v,該怎么辦?

Rust編譯器: 你可以把所有權暫時借用(&v)給print_vector,等函數返回就可以接著使用了。

fn main() {
    let mut v = vec![1,2,3,4]; //創(chuàng)建一個可變Vector
    print_vector(&v);
    println!(" the 1st element is {}",v[0]);    
}
fn print_vector(v: &Vec<i32>){
  ......
}

這個借用就相當于Java語言的引用了,張大胖想,print_vector函數已經“借到”所有權,應該可以為所欲為了吧,于是在函數內做了修改:

fn print_vector(v: &Vec<i32>) {
    v.push(3);
    .....
}

再次編譯,再次失敗!張大胖感覺到要吐血了,這Rust實在太不講道理了。 

Rust編譯器:“你這個借用想要改變原來的對象,也得加上 &mut才行!”

fn main() {
    let mut v = vec![1,2,3,4]; //創(chuàng)建了一個Vector
    print_vector(&mut v);
    println!(" the 1st element is {}",v[0]);    
}

fn print_vector(v: &mut Vec<i32>) {
    v.push(3);
    ......
}

總結一下:

圖片圖片

張大胖繼續(xù)寫代碼,想繼續(xù)測試這個所謂“借用”:

fn main() {
    let mut x = String::from("hello");
    let x1 = &x;
    let x2 = &mut x;    
    println!("{}", x1);    
}

編譯還是出錯:‘x’已經有一個不可變借用了,不能再以可變的方式來借用!

張大胖徹底懵逼了!

想我叱咤編程界多年,先后學會了C,C++, Java, Ruby ,Python, 從來就沒見過這么復雜的語言,這么簡單的程序,編譯都通不過。

Rust編譯器:道理很簡單,x1是不可變引用,x2是可變引用,使用x1的"用戶"可不希望訪問x1時,數據已經改變了。我告訴你一個簡單的口訣,以后再遇到問題就迎刃而解了:共享不可變, 可變不共享。

(用嚴格的描述來說是這樣: 同一時刻,要么只有一個可變(&mut)借用,要么有多個不可變(&) 借用,不能同時存在可變和不可變借用。 

)

圖片圖片

(都對一個對象做讀操作,安全!)

圖片圖片

(只有小張可以寫,因為他是可變的借用)

張大胖琢磨了一下,這口訣用人話來說是這樣的: 當大家都在讀一個東西的時候,是不能寫的。當一個人在寫的時候,別人是不能讀的, 這不就是經典的讀寫鎖問題嗎?這Rust居然在編譯器級別做了這種限制 !

Rust編譯器:我之所以由這么嚴格的限制,就是為了內存安全,我的這套體系是不需要GC的,只要你能按照我的規(guī)矩來,內存安全就能保證。

張大胖:你啊,是為了懶省事,把本來可以讓虛擬機干自動做的事情,都交給程序員來做了,這是要把我們累死啊!

Rust編譯器:你到底做過系統級編程沒有?系統級編程要求:

1. 非常快

2. Runtime 很小(虛擬機就是一個巨大無比的Runtime)

3. 能直接訪問內存,并且內存安全。 

C和C++基本滿足,但是內存不安全, 像Java, Python,Ruby 除了內存安全之外,別的都不滿足,只適合應用層編程。

張大胖無語了,這家伙的目標是要替換C/C++,自己也寫過不少C代碼,由于內存問題,不知道搞垮過多少個程序,懸空的指針就像幽靈一樣到處飄蕩,無蹤可循,然后在一個未知的地點,未知的時刻突然爆裂。

這個Rust,每個對象都有唯一的“主人”,然后有對讀寫施加了這么嚴格的限制,如果程序員掌握了,確實比C語言安全, 我還是接著學吧!

責任編輯:武曉燕 來源: 碼農翻身
相關推薦

2019-06-26 08:30:32

計算機互聯網iOS

2012-02-21 09:22:45

2011-02-22 09:24:30

諾基亞微軟

2009-07-03 16:21:58

IT系統數據中心運維管理

2021-08-06 09:20:41

IT管理IT領導者CIO

2022-03-08 09:00:00

Kubernetes容器技術

2011-07-08 13:34:16

2018-03-27 10:15:58

微信紅包個人信息

2014-09-10 10:14:14

2020-12-18 15:08:17

微信詐騙移動應用

2020-06-11 16:15:25

Java線程池代碼

2017-04-21 13:50:37

硬盤磁盤

2017-12-25 08:55:45

網站虛擬主機

2020-12-07 07:48:35

K8sDockerKubernetes

2017-01-15 21:22:38

2017-07-12 20:25:35

災備

2024-06-20 18:15:55

2023-08-03 07:13:59

2012-01-05 09:01:47

2014-09-01 09:50:58

程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产小视频精品 | 2021狠狠天天天 | 特黄毛片| 欧美日韩一区二区电影 | h肉视频| 欧美精品一区二区三区四区 在线 | 欧美日韩国产三级 | 亚洲国产精品一区二区久久 | 欧美日韩视频在线 | 久久久久久久一区 | 涩涩视频在线观看 | 午夜免费视频 | 国产一区91精品张津瑜 | 91中文| 在线成人av | 亚洲第一av网站 | 亚洲精品无 | 久久噜噜噜精品国产亚洲综合 | 中文字幕av一区 | 成人午夜免费视频 | 久久久不卡网国产精品一区 | 日日干夜夜操天天操 | 九九热re| 欧美大片一区二区 | 中文字幕高清av | 黄色免费在线观看 | 国产亚洲一区二区三区在线观看 | 99re视频在线观看 | 天堂色 | 9191av | 久久精品国产a三级三级三级 | 亚洲欧美中文日韩在线v日本 | 亚洲精色| 日韩一级精品视频在线观看 | 欧美国产一区二区三区 | 国产98色在线 | 日韩 | 国产视频第一页 | 久久久久黄| 国产伊人精品 | 久久久久久国产精品mv | 成人免费精品视频 |