bind ⦃storage⦄ ⟦move⟧ <…>

Much like defer expressions, bind expressions evaluate a sub-expression constructor once when first rendered.

However, they also shift the constructor scope of a sub-expression into its parent's render scope.

This lets you use render parameters as constructor parameters:

#![allow(unused)]
fn main() {
asteracea::component! {
  Early(
    priv early: &'static str,
  )()

  ["Constructor parameter: " !"{:?}"(self.early)]
}

asteracea::component! {
  Late()(
    late: &'static str,
  )

  bind <*Early *early = {late}>
}

asteracea::component! {
  pub Test()() -> Sync?

  [
    <*Late priv tested .late = {"first"}> "\n"
    <*{self.tested_pinned()} .late = {"second"}>
  ]
}
}
Constructor parameter: "first"
Constructor parameter: "first"

As you can see, early is only assigned once. late is discarded during the second call.

By default, the sub-expression constructor acts like (read: is) a plain Rust closure without additional keywords, but you can apply the move keyword after the optional storage configuration.