5 个非常有用的 Rust 小技巧

自从做了 https://github.com/chainx-org/ChainX
项目以后,主力语言就转到了 Rust,今天刚好这个文章,比较剪短,跟大家分享一下。

在开始之前,跟大家简单介绍 ChainX 项目。ChainX 是一个基于 substrate 专注于区块链资产跨链项目,目前已经实现了 BTC 跨链, 可以在我们的测试网进行充值体验,如何参与测试网请点击这里

我们将会在最近上线主网,并进行开源,欢迎有识之士进行关注,项目地址是: https://github.com/chainx-org/ChainX
。此外,也欢迎开发者加入我们的开发群,有兴趣的可以私信我加群。

ChainX 也在不断招人,运营,技术都招,如果有任何想法,欢迎与我联系,期待大牛加入!

好了,开始今天的“正题”:


更“护眼”的 print 调试

当我们用 print 大法进行调试的时候,经常会用到 :? 格式化操作符。但是除此以外,还有另外一些非常好用的操作符!另一个非常有用的就是 :#?,它会自动加入换行和缩进来增强输出的可读性。

#[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,
}

关于调试,还可以了解一下最近新加的 dbg!https://doc.rust-lang.org/std/macro.dbg.html

unimplemented!

有时候,你可能会想要一个不用进行完整实现的函数。比如,你可能想要一些方法的测试,又或者你想要为以后的开发保留某个 feature,这时 unimplemented! 就会派上用场。如果想要的类型是什么,unimplemented! 都会被展开为能够编译的表达式。

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

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

.. 结构体字面操作符

有时候,你想要部分地复制一个结构体,也就是里面有部分字段不一样,但是其他字段保留复制结构体里面的内容。尽管你可以通过手动 clone 然后进行修改,但是还有更简单的方式!通过 .. 操作符后面跟着这个结构体的另一个实例,剩下的字段就会用后面这个实例的字段填充。此外,它并不要求结构体实现 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

有时当使用模式匹配时,你所匹配的模式并没有跟你想要处理的格式完美匹配。比如,你可能会写这样的代码:

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,
    }
}

你大可以把这两种情况组合起来:

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,
    }
}

但是,还有更好的方式!模式后面可以跟着一个条件表达式,叫做 “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 里面进行左侧填充字符?不需要任何额外的包就可以实现!只要用 :> 操作符后面跟上一个长度,然后就好了!

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

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

这会打印出:

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

等一下,还没完!如果你想要两边填充,也有办法, :^ 后面跟上填充后的字符串宽度就行了:

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

这会打印出:

[  padded  ]

你知道还可以用不同的字符进行填充吗?只要在箭头前面指定填充字符就行了!

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);

这会打印出:

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350