Rust 的基本型別
Rust 的型別是非常重要的,因為它可以幫助我們在編譯時期就找出錯誤,而不是在執行時期才發現錯誤。
所以我們要了解一下 Rust 的型別,並且要知道如何使用它,才能夠感受到 Rust 帶來的好處。
Rust 主要有 4 種基本型別:
整數
浮點數
布林
字元
整數整數有兩種變形,分為非帶號(Unsigned)、帶號(Signed):
長度
Unsigned
Signed
8位元
u8
i8
16 位元
i16
u16
32 位元
i32
u32
64 位元
i64
u64
128 位元
i128
u128
系統架構
isize
usize
兩個的差異在在負號的差別,帶號就是帶負號,每一個帶號可以儲存的數字範圍從 -(2n - 1) 到 2n-1 -1 以內的數字,n 是位元,例如 8 位元的 i8 最小到 -128,最大到 127;而非帶號的 u8 最小因為沒有負數,所以就從 0 開始,最大到 255。
比較特別的是 isize 和 usize 是依據使用者程式運行的電腦架構來決定大小,如果在 64 位元架構的電腦上就是 64 位元,以此類推。
...
優雅的寫出函式
函式在 Rust 中非常重要,從我們的第一天開始就已經展示過函式了。而且在 Rust 寫函式的感覺非常簡單俐落,宣告一個函式就可以不用打很多字,超爽的~
那麼就一起來看怎麼寫函式吧!
函式在 Rust 中,至少都會有一個主函式,也就是 main,而要宣告一個函式也非常簡單,只需要用關鍵字 fn 並接上函式的名稱,並且在後面加上 (),這裡可以加上參數或是不加都可以,最後再加上 {} 就宣告了一個函式,就像這樣:
12fn main() {}
在一般程式中當然不會只有一個函式,所以接著來宣告另一個函式。前面有提到 Rust 的命名慣例是使用 snack case,所以要建立一個 do_stuff 的函式就像這樣:
123fn do_stuff() { println!("Hello, world!");}
那麼要怎麼執行 do_stuff() 呢?只需要在 main() 中呼叫即可:
1234567fn main() { do_stuff();}fn do_stuff() { ...
變數的守備範圍 - 作用域
昨天我們介紹完了變數的用法,那麼今天來介紹一下變數的作用域。
作用域作用域,也就是變數的有效範圍。
一般程式語言在宣告變數後,變數都有它的有效區域。可以把他想成把一個球員派上場,他的活動範圍就會在某個區塊。
而 Rust 也不例外,可以看下方的範例,x 這個變數在大括號中都是有效範圍。而在大括號中又建立了一個大括號,並且宣告了一個變數 y,這裡我們給一個註解叫做 y 區塊,比較好辨識,並且要用 println! 把 x 和 y 給印出來。
12345678fn main() { let x = 10; // y 區塊 { let y = 20; println!("x: {}, y: {}", x, y); }}
最終也可以成功印出 x: 10, y: 20 。雖然在 y 區塊中,並沒有宣告 x,但是由於在 main(){} 中這個大括號已經有宣告,而 x 的作用域在整個 main(){} 中都是有效 ...
從基本功開始打起 - 變數
從今天開始會試著跟大家說明 Rust 的基本知識,只要能夠知道這些基本的話,相信就能掌握 Rust 了!應該吧?
宣告變數首先會先從變數開始,在 Rust 宣告變數只要使用關鍵字 let,例如我們要宣告一個變數 count,並且給予值為 20 的話,就可以這樣寫:
123fn main() { let count = 20;}
然後記得後面要加 ;,這邊有一個比較特別的是預設情況下,變數的值是不能再改變的。
型別Rust 是一種強型別的語言,代表要指定變數的型別,然後在編譯時檢查型別是否正確。
那麼為什麼上面的例子沒有寫型別也可以正確編譯呢?
這是因為 Rust 有 type inference,也就是型別推斷的功能。如果能夠判別型別的話,就不需要寫出來。但如果要寫的話,就可以這樣寫:
1let count: i32 = 20;
這一段的意思是,建立一個變數 count,綁定型別為 i32,而賦予的值為 20。關於型別的部分會在之後有完整的篇幅說明。
模式Rust 提供了一種叫做模式 (Patterns) 的宣告變數技巧,使用方法如下:
1let (x, ...
用 Cargo 管理專案好棒棒
昨天我們自己新增了一個副檔名為 rs 的檔案,然後在終端機執行 rustc 來編譯出結果。雖然這樣的作法沒什麼問題,但是只適合用在簡單的情況下。如果是一個龐大而且複雜的案例的話,顯然是沒辦法很有效地管理我們的專案,於是 Rust 也幫我們設想好,並且提供了 Cargo。
什麼是 CargoCargo 可以做到套件管理、建構系統、跑測試,甚至是產生文件,Cargo 的角色就像是 JavaScript 的 NPM,或是 Python 的 Pip。
由於安裝 Rust 的時候,已經順便安裝了 Cargo,如果想確認有沒有安裝完成的話,可以在終端機輸入:
$ cargo –version
或是
$ cargo -V
正常顯示出版本號的話,就代表你的 Cargo 已經安裝好了。
建立專案既然已經有了 Cargo,那麼接下來就來用 Cargo 來建立一個專案。例如要建立一個名稱為 hello_world 專案的話請在終端機輸入:
1$ cargo new hello_world
可以看到 Cargo 幫我們建立了一個 hello_world 專案,並且產生下圖中的檔案以及目錄。
可以看到 Ca ...
先從意料中的 Hello World 開始
今天就先從最基本的 Hello World 開始我們的 Rust,但第一步要先安裝環境,那麼就開始吧!
安裝基本上在安裝過程中沒有太多的難度,也不用繁複的設定,就可以在各個系統中順利安裝。
由於我是使用 Mac 來安裝,所以只需要開啟終端機,並輸入:
1$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
這裡是使用 rustup 這個版本管理工具來進行安裝,接著會如下圖中,問你要怎麼安裝,如果沒有什麼特殊需求的話,我們只需要輸入 1 用預設的就好。
沒什麼意外的話,就會跟你說安裝已完成,但他還提示我們需要設定環境變數,一樣照著他指示的做,在終端機輸入:
1$ source "$HOME/.cargo/env"
如果上述的過程中都沒遇到問題的話,那就來檢查是否安裝成功,輸入:
1$ rustc -V
或是:
1$ rustc --version
如果成功安裝的話,就會顯示安裝的版本,截至目前最新的版本是 1.63.0
如果是其他系統的使用者的話,進入到 Ru ...
開始學 Rust 的前言
學習的動機我是一個前端工程師,但一直想找個程式語言來學一下後端。雖然說 JavaScript 發展到現在,也已經有 Node.js 可以來做後端的工作,甚至也有很多框架可以選擇。但都寫了這麼久的 JavaScript,雖然還不到膩,但還是想要學點新東西。
所以就看了很多文章,聽取很多大大的建議,老闆也時不時的推坑,介紹 Rust 有多猛就有多猛,看得我覺得 Rust 好像很神,所以就決定這次鐵人賽要以學好 Rust 為主要目標,希望能夠以一個程式小白的角度,儘量不去跟其他語言做比較,寫出我自己所理解的 Rust,然後這 30 天就快快樂樂的體會 Rust 帶給我的樂趣吧!
什麼是 Rust?既然已經決定要開始學 Rust,總是要先了解一下學 Rust 可以幹嘛。
所以,什麼是 Rust?
Rust 是由 Graydon Hoare 所設計,起初這只是他自己的一個 Side Project,後來他進入了 Mozilla,也就是 FireFox 的公司。然後 Mozilla 開始贊助並主導開發,並且也試著把 FireFox 的 C + + 的程式碼部分,取代為成安全性較高的 Rust。 ...
了解 Redux 並實作一個範例
在開發網站時,有時狀態可能會傳來傳去,不好掌控狀態流,就可能會有 bug,這不是開發者樂見的,還好我們有 Redux 可以幫忙處理這個問題。
什麼是 ReduxRedux 是一個管理狀態的 JavaScript library,一般會跟 React 搭配使用。但其實可以運用在原生的 JavaScript,甚至在其他 JavaScript 框架也能使用。
Redux 核心概念可以參照下圖所示 ⬇️
Redux 的概念是所有 state 是來自建立的 store 統一管理,而 state 是唯讀,能夠確保不會隨意變更。
當某一個元件想要改變 state 時,必須要透過 dispatch 去發送 action。
Reducer 是一個 pure function,會帶入 state 和 action,並且回傳一個新的 state,藉由這樣的動作去變異 store 中管理的 state。
實作範例這篇會透過原生的 JavaScript 來實作一個加減點擊案例。
從 Redux 取出 creatStore,並建立一個 store 變數123const { createStore & ...
除了 useState,你可以選擇更好管理狀態的 useReducer
標題有點引戰,但是如果想要跨元件處理狀態,並且狀態非常複雜的話,那麼 useState 可能就不是那麼好管理,也許可以試試看 useReducer。
使用情境之前有寫過 useState 的介紹文章,裡面的範例是一個點擊器,可以透過點擊不同按鈕去反應結果,這篇就來使用 useReducer 來做出一樣的成果。
初始設置首先將會分成 3 個元件,分別是加按鈕、減按鈕,還有計算結果,這邊計算結果是用 input 欄位,可以讓使用者自行輸入。
1234567891011121314151617181920// 減const MinusCount = () => { return <button type="button">-</button>;};export default MinusCount;// 加const PlusCount = () => { return <button type="button">+</button>;};exp ...
使用 useContext 處理跨元件狀態
寫了這麼久 React,發現我的筆記都沒整理過,趁最近比較不忙來清理一下筆記 XD這次要分享的是跨元件處理狀態的 hook – useContext。
使用情境一般寫 React 時,如果需要將元件的狀態傳遞的話,如果是簡單的父子元件傳遞,可以用 props 來傳。但如果是很多層的情況,或是同層的子組件要互傳狀態的話,可能用 props 就不是這麼適合。當然也可以使用一些狀態管理的套件,例如:Redux(之後會找時間分享)。不過,其實 React 內建就有 useContext 這個 hook,這邊就來示範一下作法:
使用的情境是分別有兩個元件,有一個輸入框 - A,跟一個顯示輸入的文字 - B,如果 A 改變輸入的文字,那麼 B 就會即時顯示該文字。
初始設置以下是原始的程式碼,可以看到分別有 InputText.js 跟 ShowText.js 兩個元件放在 App.js 中
12345678910111213141516171819202122232425262728293031323334353637// App.jsimport InputText from ' ...