iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0

Project Struct - Trace code 入手點

Rust有一個特點就是 你最簡單的方式是從 project root的main.rs main function 作為入口位置開始運行程式碼. 這是基於 cargo project的convention.
以下是一是 cargo 提出的 project struct: 幾乎可套用到大部分的專案.

.
├── Cargo.lock
├── Cargo.toml
├── src/
│   ├── lib.rs
│   ├── main.rs
│   └── bin/
│       ├── named-executable.rs
│       ├── another-executable.rs
│       └── multi-file-executable/
│           ├── main.rs
│           └── some_module.rs
├── benches/
│   ├── large-input.rs
│   └── multi-file-bench/
│       ├── main.rs
│       └── bench_module.rs
├── examples/
│   ├── simple.rs
│   └── multi-file-example/
│       ├── main.rs
│       └── ex_module.rs
└── tests/
    ├── some-integration-tests.rs
    └── multi-file-test/
        ├── main.rs
        └── test_module.rs

bin

如果我需要有多個進入點, 但用想保持在同一個repository

這時候可以將不同的 .rs file 置放於 src/bin/之下 cargo run --bin named-executable 來執行

examples

這個地方會是開啟一個open source的project中很好的進入點. 以most downloaded 的 lib: rand.
由於性質不同, src底下並不會找到 main.rs.

但對於survey一個新的lib, 最想知道的是, 這包code是不是符合library敘述. examples 底下的monte carlo就是一個對於亂數library非常重要的應用.

基本上看到蒙地卡羅模擬,就可以知道這個library是用來產生亂數的。而且這個例子也很簡單,只有一個函數,不需要引入其他的函數庫,就可以直接執行。

test

和其他程式語言不同, unit test在官方文件建議下會推薦直接放在所屬src的.rs檔案中.
這個地方是擺放 End-to-End test的地方. 後面的文章會詳細的說明該怎麼寫測試.

Compiler - Rust路上最大的敵人與朋友

這個幾乎可以說是rust這個語言很美妙也很痛苦的地方. 這邊僅展現一個對陌生語言正確衝鋒的態度.
舉個例子來説:

struct Human{
    name: String,
    age: u8,
}

struct Group{
    name: String,
    members: Vec<Human>,
}

fn main() {
 let g1 = Group();
}

毫無意外的出現error. 這個compiler 相較其他語言的compiler給出了非常詳細的錯誤訊息以及建議修改的方式.

error_msg)
有兩個特別的重點:

  1. E0423 這個error code. 往常最基本上找尋error message都是透過搜尋關鍵字. 但這邊有官方維護的error code, 對於
  2. ^^^^^^ 的提示內容. 提供更詳細直接的try的方法.

一個足夠小的練習

在開啟一個新的程式語言的路徑上, 筆者覺得最有效率的方式是開啟一個足夠大也足夠小的專案

這30天的鐵人賽範例會圍繞打造一個桌遊-> 奇雞連連的單人遊戲服務.

為了能夠讓讀者可以一起想像如何建模, 掌握這個規則簡單但是變化性豐富的遊戲是必須的. 以下會用程式需要的方式介紹這個遊戲

gobblet

遊戲可以想像作為圈圈叉叉 的升級版. 但是有一些不同的地方.
雙方各自有三種大小的棋子, 每個大小總共有2個
可以在棋盤上任意的放置. 但是一個棋子只能放在比他小的棋子上面.
例如一個大的棋子只能放在中的棋子上面, 一個中的棋子只能放在小的棋子上面.
空的地方則可以任意放置.

和一般最圈圈叉叉最大不同的地方在於. 我們可以從棋盤上拿走自己顏色的棋子放置到棋盤上其他合法的位置, 但是這個行動並不是一個atomic的結果, 如果在拿起的瞬間造成對方勝利, 則這個行動視為輸了遊戲.

YT的教學


上一篇
[D1]Rust還是不免俗的hello world
下一篇
[D3] 讓程式跑起來
系列文
大閘蟹料理指南(rust)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言