5つの非常に有用なRustテクニック

4381 ワード

やってからhttps://github.com/chainx-org/ChainXプロジェクトの后で、主力の言语はRustに回転して、今日ちょうどこの文章、比较的に短くて、みんなと分かち合います.
始まる前に、ChainXプロジェクトを簡単に紹介します.ChainXはsubstrateに基づいてブロックチェーン資産チェーンプロジェクトに専念し、現在BTCチェーンを実現しており、私たちのテストネットワークでチャージ体験を行うことができます.どのようにテストネットワークに参加するかはここをクリックしてください.
私たちは最近主網をオンラインにし、オープンソースを行い、有識者の注目を歓迎します.プロジェクトの住所は:https://github.com/chainx-org/ChainX .また、開発者が私たちの開発グループに参加することを歓迎します.興味があれば、私はグループを追加することができます.
ChainXも絶えず人を募集して、運営して、技術はすべて募集して、もしどんな考えがあるならば、私と連絡することを歓迎して、大牛が参加することを期待します!
さあ、今日の「本題」を始めましょう.

より「保護眼」のprintデバッグ


print大法でデバッグする場合、:?フォーマットオペレータがよく使用されます.しかし、それ以外にも、とても使いやすいオペレータがあります!もう1つの非常に有用なのは、出力の可読性を向上させるために改行とインデントを自動的に追加する:#?です.
#[derive(Debug)]
struct Foo {
    x: i32,
    y: i32,
}

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

println!("Simple debug:
{:?}", foo); println!("Pretty debug:
{:#?}", 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 {
    Empty,
    Elem(T, Box),
}

impl VerySimpleList {
    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, y: Option) -> Option {
    match (x, y) {
        (Some(i), Some(0)) => None
        (Some(i), Some(j)) => Some(i / j)
        _ => None,
    }
}

この2つの状況を組み合わせることができます
fn divide_opt(x: Option, y: Option) -> Option {
    match (x, y) {
        (Some(i), Some(j)) => {
            if j == 0 {
                None
            } else {
                Some(i / j)
            }
        }
        _ => None,
    }
}

しかし、もっと良い方法があります!モードの後ろには、「guard」という条件式があります.
fn divide_opt(x: Option, y: Option) -> Option {
    match (x, y) {
        (Some(i), Some(j)) if j != 0 => Some(i / j),
        _ => None,
    }
}

[塗りつぶし形式](Fill Format)オペレータ


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/