简体   繁体   中英

Rust playground - provide command line argument

I am using the Rust Playground to test a piece of code, sample:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    let query = args.get(1).unwrap();
    // do something ...
}

Playground link

How do I provide a command-line argument for running a program in Rust Playground? The sample drop-down next to the run button does not have any link or perhaps I am missing it?

Thanks!

You can't, there is an open issue for this feature

As @Stargateur correctly answered, it's currently impossible to provide input for the playground code itself. However, there's a little trick which can work in relatively simple cases: we can execute std::process::Command , which starts bash, which can execute arbitrary code - including cargo .

Here's how it can look like, for example:

// This is your real `fn main`, which would use the input.
// It can contain everything that's usually possible in the playground.
#[cfg(real_main)]
fn main() {
    let args: Vec<String> = std::env::args().collect();
    println!("Args: {:?}", args);
}

// This is the wrapper-function, directly executed by the playground.
#[cfg(not(real_main))]
fn main() {
    // We're shelling out to `bash`, to execute `cargo run` with additional config.
    let _ = std::process::Command::new("/bin/bash")
        .args(&[
            "-c",
            concat!(
                r##"{
"##,
                // In case we have any kind of error, we want to exit loudly.
                r##"
set -euo pipefail
"##,
                // `cargo rustc` allows one to pass additional compiler flags.
                // It's important that this will recompile the current crate only,
                // since, if we had to build the whole dependency tree
                // (which is quite large), playground will inevitably timeout.
                r##"
cargo rustc -q -- --cfg real_main
"##,
                // When building in release mode, replace `target/debug`
                // with `target/release`.
                r##"
./target/debug/playground arg1 arg2 arg3
"##,
                // Finally, we rediirect the stderr of the whole script to stdout,
                // to show it in the playground output.
                r##"
} 2>&1"##
            ),
        ])
        // On running `Command::status`, output is piped by default,
        // so it will be shown as usual.
        .status();
}

Playground link

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM