読者の皆様へ:ノイズを減らすための一連の機能を開発しました。関心のあるトピックについて電子メールとWeb通知を受け取ることができます。新機能の詳細をご覧ください。
バージョン1.26のRustでは、存在型、match
バインディングの改善、スライスパターン、有用な糖衣構文のサポートが追加される。Rustコンパイラも高速になり、128ビット整数をサポートする。
存在型はimpl Trait
によって実装される。これにより、実際の具体的な型を指定せずに、関数から戻り値の型を指定することができる。次に例を示す。
fn foo() -> impl Trait {
// ...
}
上のスニペットでは、foo
は、具体的な型を指定せずにTrait
特性を実装する型を返す関数として宣言されている。これは、次の宣言といくらか同じである。
fn foo() -> Box<Trait> {
// ...
}
しかし、Box<Trait>
を使用することは、必ずしも望ましくないまたは必要ではない動的割り当てを意味する。代わりにimpl Trait
は静的ディスパッチを保証する。これはfoo
が同じ型の結果を返すことだけを要求する。さらに、次の例に示すように、impl Trait
構文ではグルーが少なくなる。
trait Trait {
fn method(&self);
}
impl Trait for i32 {
// implementation goes here
}
impl Trait for f32 {
// implementation goes here
}
fn new_foo() -> impl Trait {
5 // we can just return an i32 here
}
fn old_foo() -> Box<Trait> {
Box::new(5) as Box<Trait> // this is cumbersome
}
新しいimpl Trait
構文は、Fn
特性を実装するクロージャを返す関数を定義するときにその価値を発揮する。
fn foo() -> impl Fn(i32) -> i32 {
|x| x + 1
}
impl Trait
構文は、以下の例のようにジェネリック型宣言の代わりに使用することもできるが、この場合は存在型でなく、汎用型を定義することになる。
// before
fn foo<T: Trait>(x: T) {
// after
fn foo(x: impl Trait) {
経験豊富なRustプログラマと新人Rustプログラマの両方にとってより使いやすくなるもう1つの改良点は、match
バインディングの改良である。それによって、プログラマはコンパイラ内部の理解が少なくて済むようになる。たとえば、次のコードは現在有効である。
fn hello(arg: &Option<String>) {
match arg {
Some(name) => println!("Hello {}!", name),
None => println!("I don't know who you are."),
}
}
以前のバージョンのRustでは、コンパイラに理解させるためにいくつかの定型文を追加する必要があったが、プログラマの意図と一致させる上でのあいまいさがなくなった。
match arg {
&Some(ref name) => println!("Hello {}!", name),
&None => println!("I don't know who you are."),
}
}
マッチングについて言えば、Rust 1.26は、以下の例のように、配列スライス上のマッチングもサポートしている。
fn foo(s: &[u8]) {
match s {
[1, x] => "Starts with one and has 2 elements",
[a, b, c] => "Has three elements",
_ => "Everything else",
}
}
Rust 1.26の比較的小さな2つの特徴は、main
からResult
を返し、1..=3
のような包含範囲を定義することが可能であるということである。
Rust 1.26の新機能をすべて知りたい場合は、公式リリースノートを見逃さないでください。
Rate this Article
- Editor Review
- Chief Editor Action