Tuples
Tuples in Rune are fixed-size sequences of values. Similarly to a vector, tuples can contain any sequence of values. But there's no way to change the size of a tuple.
let values = ("Now", "You", "See", "Me");
dbg!(values);
values.2 = "Don't";
values.3 = "!";
dbg!(values);
$> cargo run -- run scripts/book/tuples/tuple_masquerade.rn
("Now", "You", "See", "Me")
("Now", "You", "Don\'t", "!")
The following is a simple example of a function returning a tuple:
fn foo() {
(1, "test")
}
dbg!(foo());
$> cargo run -- run scripts/book/tuples/basic_tuples.rn
(1, "test")
Tuples can also be pattern matched:
match ("test", 1) {
("test", n) => {
dbg!("the first part was a number:", n);
}
_ => {
dbg!("matched something we did not understand");
}
}
$> cargo run -- run scripts/book/tuples/tuple_patterns.rn
"the first part was a number:"
1
Using tuples from Rust
Tuples are represented externally as primitive tuple types.
use rune::termcolor::{ColorChoice, StandardStream};
use rune::{Diagnostics, Vm};
use std::sync::Arc;
fn main() -> rune::support::Result<()> {
let context = rune_modules::default_context()?;
let runtime = Arc::new(context.runtime()?);
let mut sources = rune::sources! {
entry => {
pub fn calc(input) {
(input.0 + 1, input.1 + 2)
}
}
};
let mut diagnostics = Diagnostics::new();
let result = rune::prepare(&mut sources)
.with_context(&context)
.with_diagnostics(&mut diagnostics)
.build();
if !diagnostics.is_empty() {
let mut writer = StandardStream::stderr(ColorChoice::Always);
diagnostics.emit(&mut writer, &sources)?;
}
let unit = result?;
let mut vm = Vm::new(runtime, Arc::new(unit));
let output = vm.call(["calc"], ((1u32, 2u32),))?;
let output: (i32, i32) = rune::from_value(output)?;
println!("{:?}", output);
Ok(())
}
$> cargo run --example tuple
(2, 4)