Posted at
RustDay 2

シュッと実行する

More than 1 year has passed since last update.

 Rust のコードをシュッと実行したいときがあります。この「シュッと」には、一つのファイルで完結したい、Shebang とか書きたい、ライブラリも利用したい、などの気持ちが込められていて、cargo-script というプラグインがそれらを解決します。


インストールする

 しました。

$ cargo install cargo-script

$ cargo script --version

cargo-script 0.1.5

$ run-cargo-script --version

cargo-script 0.1.5


実行する

 いくつかの方法があります。

式を評価する。

$ cargo script -e 'println!("sugoi!")'

Compiling expr v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/expr-cecc8cdbd4a5813e)
Finished release [optimized] target(s) in 1.0 secs
sugoi!
()

ファイルを渡して実行する。


sugoi.rs

fn main() {

println!("sugoi!")
}

$ cargo script sugoi

Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-63e1f1239355abaa)
Finished release [optimized] target(s) in 2.66 secs
sugoi!
...

ファイルに権限を付与して実行する。


sugoi.rs

#!/usr/bin/env run-cargo-script

fn main() {
println!("sugoi!")
}


$ chmod +x sugoi.rs

$ ./sugoi.rs
Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-63e1f1239355abaa)
Finished release [optimized] target(s) in 0.17 secs
sugoi!

出力を見ると、裏で人間の代わりにプロジェクトをつくるなどしている様子がわかります。


依存する

 ファイルを "Cargoified" して利用したいライブラリを指定します。


sugoi.crs

//! ```cargo

//! [dependencies]
//! rand = "0.3"
//! ```

extern crate rand;

use rand::distributions::{IndependentSample, Range};

fn main() {
let range = Range::new(1, 10);
let mut rng = rand::thread_rng();
let count = range.ind_sample(&mut rng);

println!("sugoi{}", vec!("!"; count).concat())
}


$ cargo script sugoi

Compiling libc v0.2.17
Compiling rand v0.3.14
Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-c415f45777c10429)
Finished release [optimized] target(s) in 5.99 secs
sugoi!!!!!!!

もっと雑に書きたいんだ私はという人のための書式もあります。


sugoi.crs

// cargo-deps: rand="0.3"

extern crate rand;

use rand::distributions::{IndependentSample, Range};

fn main() {
let range = Range::new(1, 10);
let mut rng = rand::thread_rng();
let count = range.ind_sample(&mut rng);

println!("sugoi{}", vec!("!"; count).concat())
}


バージョンを指定しない。

// cargo-deps: rand

複数のライブラリを使いたい。

// cargo-deps: rand, regex

元々のモチベーションを考えると、これくらいが良さそう。


やっていく

 シュッとやっていきましょう。