Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
33
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@woxtu

シュッと実行する

 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

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

やっていく

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
33
Help us understand the problem. What are the problem?