5 個(gè)非常有用的 Rust 小技巧

自從做了 https://github.com/chainx-org/ChainX
項(xiàng)目以后,主力語(yǔ)言就轉(zhuǎn)到了 Rust,今天剛好這個(gè)文章,比較剪短,跟大家分享一下。

在開(kāi)始之前,跟大家簡(jiǎn)單介紹 ChainX 項(xiàng)目。ChainX 是一個(gè)基于 substrate 專(zhuān)注于區(qū)塊鏈資產(chǎn)跨鏈項(xiàng)目,目前已經(jīng)實(shí)現(xiàn)了 BTC 跨鏈, 可以在我們的測(cè)試網(wǎng)進(jìn)行充值體驗(yàn),如何參與測(cè)試網(wǎng)請(qǐng)點(diǎn)擊這里

我們將會(huì)在最近上線主網(wǎng),并進(jìn)行開(kāi)源,歡迎有識(shí)之士進(jìn)行關(guān)注,項(xiàng)目地址是: https://github.com/chainx-org/ChainX
。此外,也歡迎開(kāi)發(fā)者加入我們的開(kāi)發(fā)群,有興趣的可以私信我加群。

ChainX 也在不斷招人,運(yùn)營(yíng),技術(shù)都招,如果有任何想法,歡迎與我聯(lián)系,期待大牛加入!

好了,開(kāi)始今天的“正題”:


更“護(hù)眼”的 print 調(diào)試

當(dāng)我們用 print 大法進(jìn)行調(diào)試的時(shí)候,經(jīng)常會(huì)用到 :? 格式化操作符。但是除此以外,還有另外一些非常好用的操作符!另一個(gè)非常有用的就是 :#?,它會(huì)自動(dòng)加入換行和縮進(jìn)來(lái)增強(qiáng)輸出的可讀性。

#[derive(Debug)]
struct Foo {
    x: i32,
    y: i32,
}

let foo = Foo { x: 1, y: 2 };

println!("Simple debug:\n{:?}", foo);
println!("Pretty debug:\n{:#?}", foo);
Simple debug: 
Foo { x: 1, y: 2 }

Pretty debug: 
Foo {
  x: 1,
  y: 2,
}

關(guān)于調(diào)試,還可以了解一下最近新加的 dbg!https://doc.rust-lang.org/std/macro.dbg.html 。

unimplemented!

有時(shí)候,你可能會(huì)想要一個(gè)不用進(jìn)行完整實(shí)現(xiàn)的函數(shù)。比如,你可能想要一些方法的測(cè)試,又或者你想要為以后的開(kāi)發(fā)保留某個(gè) feature,這時(shí) unimplemented! 就會(huì)派上用場(chǎng)。如果想要的類(lèi)型是什么,unimplemented! 都會(huì)被展開(kāi)為能夠編譯的表達(dá)式。

enum VerySimpleList<T> {
    Empty,
    Elem(T, Box<VerySimpleList>),
}

impl<T> VerySimpleList<T> {
    fn len(&self) -> usize {
        match self {
            VerySimpleList::Empty => 0,
            VerySimpleList::Elem(..) => unimplemented!(),
        }
    }
}

.. 結(jié)構(gòu)體字面操作符

有時(shí)候,你想要部分地復(fù)制一個(gè)結(jié)構(gòu)體,也就是里面有部分字段不一樣,但是其他字段保留復(fù)制結(jié)構(gòu)體里面的內(nèi)容。盡管你可以通過(guò)手動(dòng) clone 然后進(jìn)行修改,但是還有更簡(jiǎn)單的方式!通過(guò) .. 操作符后面跟著這個(gè)結(jié)構(gòu)體的另一個(gè)實(shí)例,剩下的字段就會(huì)用后面這個(gè)實(shí)例的字段填充。此外,它并不要求結(jié)構(gòu)體實(shí)現(xiàn) Clone 約束。

#[derive(Debug, Default)]
struct Foo {
    x: i32,
    y: i32,
}

let a = Foo { x: 1, y: 2 };
let b = Foo { x: 2, ..a };
let c = Foo { x: 2, ..Default::default() };

模式匹配 guard

有時(shí)當(dāng)使用模式匹配時(shí),你所匹配的模式并沒(méi)有跟你想要處理的格式完美匹配。比如,你可能會(huì)寫(xiě)這樣的代碼:

fn divide_opt(x: Option<i32>, y: Option<i32>) -> Option<i32> {
    match (x, y) {
        (Some(i), Some(0)) => None
        (Some(i), Some(j)) => Some(i / j)
        _ => None,
    }
}

你大可以把這兩種情況組合起來(lái):

fn divide_opt(x: Option<i32>, y: Option<i32>) -> Option<i32> {
    match (x, y) {
        (Some(i), Some(j)) => {
            if j == 0 {
                None
            } else {
                Some(i / j)
            }
        }
        _ => None,
    }
}

但是,還有更好的方式!模式后面可以跟著一個(gè)條件表達(dá)式,叫做 “guard":

fn divide_opt(x: Option<i32>, y: Option<i32>) -> Option<i32> {
    match (x, y) {
        (Some(i), Some(j)) if j != 0 => Some(i / j),
        _ => None,
    }
}

填充格式操作符

想要在 Rust 里面進(jìn)行左側(cè)填充字符?不需要任何額外的包就可以實(shí)現(xiàn)!只要用 :> 操作符后面跟上一個(gè)長(zhǎng)度,然后就好了!

let score1 = 100;
let score2 = 1000;
let score3 = 10000;

println!("{:>5}", score1);
println!("{:>5}", score2);
println!("{:>5}", score3);

這會(huì)打印出:

first player:  padded!
second player: padded!
third player:  padded!

等一下,還沒(méi)完!如果你想要兩邊填充,也有辦法, :^ 后面跟上填充后的字符串寬度就行了:

let padded = "padded";
println!("[{:^10}]", padded)

這會(huì)打印出:

[  padded  ]

你知道還可以用不同的字符進(jìn)行填充嗎?只要在箭頭前面指定填充字符就行了!

let title = "SCORES";

let player1 = "first player:";
let player2 = "second player:";
let player3 = "third player:";

let score1 = 100;
let score2 = 1000;
let score3 = 10000;

println!("{:_^20}", title);
println!("{:<14} {:>5}", player1, score1);
println!("{:<14} {:>5}", player2, score2);
println!("{:<14} {:>5}", player3, score3);

這會(huì)打印出:

_______SCORES_______
first player:    100
second player:  1000
third player:  10000

原文:https://saghm.github.io/five-rust-things/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容