序文
この連載記事では、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アップデートの主な内容ですが、もちろん私もちょっとした知識を持っているので、ここで穴をあけますが、この知識は使ってこそ有効です。