シュッと実行する

  • 50
    Like
  • 0
    Comment

 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

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

やっていく

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