読者です 読者をやめる 読者になる 読者になる

Windows上で Rust 1.3 を使用

以前、「Windows 上で Rust を使用」 では Rust 0.9 を使いましたが、今回は Rust 1.3 で試してみました。

環境構築

https://www.rust-lang.org/ から Windows installer をダウンロード (例 https://static.rust-lang.org/dist/rust-1.3.0-x86_64-pc-windows-gnu.msi) し、インストールするだけとなっています。

gcc 等もインストーラーに含まれているので (例 bin\rustlib\x86_64-pc-windows-gnu\bin\gcc.exe)、以前のように MinGW を別途インストールしたりする必要はありません。

ビルドと実行

それではサンプルソースをビルドして実行してみます。

以前の Rust 0.9 用ソースをそのままでは使えなかったので書き換えました。

sample.rs
use std::fmt;

fn main() {
    let d1 = Data { name: "data", value: 10 };
    let d2 = Data { name: "data", value: 10 };
    let d3 = Data { name: "data", value:  0 };
    let d4 = Data { name: "etc",  value:  5 };

    println!("d1 == d2 : {}", d1 == d2);
    println!("d1 == d2 : {}", d1.eq(&d2));
    println!("d1 == d3 : {}", d1 == d3);

    println!("-----");

    println!("{:?}", d1);
    println!("{}", d1);

    println!("-----");

    println!("times = {}", d1.times(3));

    println!("-----");

    d1.print_value();
    d3.print_value();

    println!("-----");

    let res = calc(&[d1, d2, d3, d4]);
    println!("calc = {}", res);
}

fn calc(list: &[Data]) -> i32 {
    list.iter().fold(1, |acc, v| acc * match v {
        // name = "data" で value の値が 0 より大きい場合
        &Data {name: "data", value: b} if b > 0 => b,
        // それ以外
        _ => 1
    })
}

// PartialEq と Debug トレイトを自動導出
#[derive(PartialEq, Debug)]
struct Data {
    name: &'static str,
    value: i32
}

// メソッドの定義
impl Data {
    fn print_value(&self) {
        match self.value {
            0 => println!("value: zero"),
            a @ _ => println!("value: {}", a)
        }
    }
}

// トレイトの定義
trait Sample {
    fn get_value(&self) -> i32;

    fn times(&self, n: i32) -> i32 {
        self.get_value() * n
    }
}

// トレイトの実装
impl Sample for Data {
    fn get_value(&self) -> i32 {
        self.value
    }
}

// {} で出力するため Display トレイトを実装
impl fmt::Display for Data {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "display (Data name={}, value={})", self.name, self.value)
    }
}

以前との主な変更点は以下の通りです ※。

  • deriving を derive へ変更
  • int を i32 へ変更
  • ~str を &'static str へ変更
  • Eq を PartialEq へ変更 (trait Eq: PartialEq<Self> となっている)
  • {} で出力するため Display トレイトを実装
  • {:?} で出力するため Debug トレイトを自動導出
 ※ Rust 1.0 で色々と変更されたようです

ビルド

rustc コマンドを使ってビルドを実施します。※
ビルドに成功すると .exe ファイルが作成されます。

 ※ インストール時に "Add to PATH" を実施しなかった場合は
    環境変数 PATH へ Rust の bin ディレクトリを追加しておく必要があります
ビルド例
> rustc sample.rs

実行

ビルドで生成された .exe ファイルは普通に実行できます。

実行例
> sample.exe
d1 == d2 : true
d1 == d2 : true
d1 == d3 : false
-----
Data { name: "data", value: 10 }
display (Data name=data, value=10)
-----
times = 30
-----
value: 10
value: zero
-----
calc = 100

今回使用したサンプルソースhttp://github.com/fits/try_samples/tree/master/blog/20150920/