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 ...
}
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();
}
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.