macro_rules! expr_var {
($($expr:tt)+) => { ... };
}Expand description
New variable from an expression with interpolated vars.
§Interpolation
Other variables can be interpolated by quoting the var with #{..}. When
an expression contains other interpolated vars the expression var updates when
any of the interpolated vars update.
§Examples
let var_a = var(10);
let var_b = var(10);
let name = "var_eq";
let var_eq = expr_var! {
let eq = #{var_a} == #{var_b};
println!("{} updated: {} == {}: {}", name, #{var_a}, #{var_b}, eq);
eq
};In the example a var_eq var of type Var<bool> is created. When either var_a or var_b are set
the value of var_eq is updated. Normal variables like name are moved in, like a closure capture.
§Capture Mode
The expression operates like a closure that captures by move. Both the interpolated variables and any
other let binding referenced from the scope are moved into the resulting variable.
§Interpolation
Variable interpolation is done by quoting the variable with #{<var-expr>}, the braces are required.
The <var-expr> is evaluated before capturing starts so if you interpolate #{var_a.clone()} var_a
will still be available after the expr_var call. Equal <var-expr> only evaluate once.
§Expansion
The expression is transformed into different types of vars depending on the number of interpolated variables.
§No Variables
An expression with no interpolation is simply evaluated into a var using IntoVar.
§Single Variable
An expression with a single variable is transformed in a map operation, unless the expression
is only the variable without any extra operation.
§Multiple Variables
An expression with multiple variables is transformed into a merge_var! call.