【一緒にRustを学ぶ|基本|Rustの新機能】Rust 1.65.0——ジェネリック関連型、let-else文


序文

この連載記事では、Rust アップデートの各バージョンの機能を紹介します。現在のバージョン以降に更新します。

今号の内容はRust 1.65.0新刊を含む最新版です。

  • ジェネリック関連型
  • let-else ステートメント
  • タグの構文を壊す

もちろん、内容を待って、この更新のもう 1 つの機能、つまり、差分Linux调试信息私はまだ Windows 環境でプログラミングしているので、内容のこの部分は書きません. 興味がある場合は、ドキュメントを更新してください。研究と研究。

さびを更新する

錆を更新していない場合は、次のコマンドを実行して錆を更新します。

rustup update stable

お使いのバージョンがナイトリーの場合は、次のコマンドを実行して更新してください

rustup default nightly

お使いのバージョンがベータ版の場合は、次のコマンドを実行して更新してください

rustup default beta

これより新しいバージョンは更新する必要はありません


1. ジェネリック アソシエーション タイプ

次のように、関連付けられた型でライフタイム、型、および const ジェネリックを定義できるようになりました。

trait Foo {
    
    
    type Bar<'x>;
}

Self からジェネリック関連型を借用できるビルダーのような特性

trait LendingIterator {
    
    
    type Item<'a> where Self: 'a;

    fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;
}

スマート ポインター ("Rc" や "Arc" など) に実装して、ポインター型のジェネリックを許可できます。

trait PointerFamily {
    
    
    type Pointer<T>: Deref<Target = T>;

    fn new<T>(value: T) -> Self::Pointer<T>;
}

配列は借用できます。データを連続して格納する必要のない "NdArray" のような型に役立ちます。

trait BorrowArray<T> {
    
    
    type Array<'x, const N: usize> where Self: 'x;

    fn borrow_array<'a, const N: usize>(&'a self) -> Self::Array<'a, N>;
}

2、let-else ステートメント

let-else 構文形式

let PATTERN: TYPE = EXPRESSION else {
    
    
    DIVERGING_CODE;
};

注:
PATTERN:変数名
TYPE:型
EXPRESSION:式
DIVERGING_CODE:コード

通常のステートメントは、静的な既知のパターンのみを使用して、返された構造体、タプルなどと一致させることができ、パターンの不一致を処理するようになりました

fn get_count_item(s: &str) -> (u64, &str) {
    
    
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
    
    
        panic!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
    
    
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}
assert_eq!(get_count_item("3 chairs"), (3, "chairs"));

名前バインディングのスコープは、それを match または if-let-else 式と区別する主な理由です

let (count_str, item) = match (it.next(), it.next()) {
    
    
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
    
    
        count
    } else {
    
    
        panic!("Can't parse integer: '{count_str}'");
    };

3、タグの構文を壊す

多くの通常のコードで、トークンを取得するためだけに使用されるループをおそらく見たことがあるでしょう。これにより、コードが非常に複雑になります。Rust は、この問題に特化した言語機能を削除しました。タグには、ループなどの式の値を含めることもでき、複数ステートメント ブロックで返回値を進めることができます。

let result = 'block: {
    
    
    do_thing();
    if condition_not_met() {
    
    
        break 'block 1;
    }
    do_next_thing();
    if condition_not_met() {
    
    
        break 'block 2;
    }
    do_last_thing();
    3
};

以前の Rust では、以下に示すように、ループ内のあいまいさを排除するためにブレーク指定フラグがサポートされていました。

fn main() {
    
    
    let mut count = 0;
    'counting_up: loop {
    
    
        println!("count = {count}");
        let mut remaining = 10;

        loop {
    
    
            println!("remaining = {remaining}");
            if remaining == 9 {
    
    
                break;
            }
            if count == 2 {
    
    
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

マークされたブレークは、コード内のブレークのあいまいさを簡単に排除できます。それ以外の場合は、ブレーク時のプログラマの経験に依存します。


要約する

上記内容がRust 1.65.0アップデートの主な内容ですが、もちろん私もちょっとした知識を持っているので、ここで穴をあけますが、この知識は使ってこそ有効です。

おすすめ

転載: blog.csdn.net/weixin_47754149/article/details/127799295