Help us understand the problem. What is going on with this article?

シュッと実行する

More than 3 years have 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

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

やっていく

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

woxtu
世界の上にタンポポをのせる仕事をしています。
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした