BT

Ready for InfoQ 3.0? Try the new design and let us know what you think!

Rustに存在型が追加された

| 作者: Sergio De Simone フォローする 21 人のフォロワー , 翻訳者 編集部T _ フォローする 0 人のフォロワー 投稿日 2018年5月28日. 推定読書時間: 4 分 |

原文(投稿日:2018/05/24)へのリンク

読者の皆様へ:ノイズを減らすための一連の機能を開発しました。関心のあるトピックについて電子メールと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

Adoption Stage
Style

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

C# 8の非同期ストリーム

Bassam Alugili 2018年10月11日 午前3時13分

BT