自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自從我學(xué)了Rust,就開始了受虐之旅,連編譯都沒成功過!

開發(fā) 開發(fā)工具
張大胖被別人安利了一個新的語言:Rust,作為編程語言的狂熱愛好者,他自然要嘗試一番。

張大胖被別人安利了一個新的語言:Rust,作為編程語言的狂熱愛好者,他自然要嘗試一番。

[[275114]]

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

  1. fn main() { 
  2.    println!("hello world"); 

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

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

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

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

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

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

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

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

所有權(quán)

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

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

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

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

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

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

張大胖:什么所有權(quán)?

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

 

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

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

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

編譯還是出錯!

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

借用

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

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

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

這個借用就相當(dāng)于Java語言的引用了,張大胖想,print_vector函數(shù)已經(jīng)“借到”所有權(quán),應(yīng)該可以為所欲為了吧,于是在函數(shù)內(nèi)做了修改:

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

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

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

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

總結(jié)一下:

 

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

  1. fn main() { 
  2.     let mut x = String::from("hello"); 
  3.     let x1 = &x; 
  4.     let x2 = &mut x;     
  5.     println!("{}", x1);     

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

張大胖徹底懵逼了!想我叱咤編程界多年,先后學(xué)會了C,C++, Java, Ruby ,Python, 從來就沒見過這么復(fù)雜的語言,這么簡單的程序,編譯都通不過。

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

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

 

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

 

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

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

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

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

Rust編譯器:你到底做過系統(tǒng)級編程沒有?系統(tǒng)級編程要求:

1. 非???/p>

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

3. 能直接訪問內(nèi)存,并且內(nèi)存安全。

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

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

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

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】 

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2020-07-03 15:10:35

Java Rust 開發(fā)

2024-11-08 09:19:28

2015-09-09 10:50:32

模擬駕駛

2020-06-12 10:10:26

云計算IT技術(shù)

2019-08-12 10:27:34

前端程序員網(wǎng)絡(luò)

2021-03-26 15:18:11

代碼工具Mockoon

2018-07-09 11:22:59

編程語言Python卡通圖片

2020-12-17 09:17:36

servlet容器

2021-10-25 10:35:08

云遷移云平臺云計算

2021-11-16 19:20:23

黑客攻擊F12

2017-07-10 16:19:36

IT發(fā)財離婚

2022-02-21 12:29:01

for循環(huán)前端

2021-10-28 19:10:51

RustPythonjs

2012-06-21 13:46:22

javascriptworklight嵌入式系統(tǒng)

2011-07-29 09:56:23

2023-06-19 14:14:24

Rust程序Web

2019-07-02 16:57:20

混合云技術(shù)Linux

2013-08-19 15:36:07

在家辦公程序員

2023-05-26 07:43:37

Wi-Fi 6Wi-Fi 7網(wǎng)絡(luò)

2023-05-12 14:52:30

點贊
收藏

51CTO技術(shù)棧公眾號