یک تایپ state pattern

#[entry]
fn main() -> ! {
    let p = Peripherals::take().unwrap();
    let gpio0 = p0::Parts::new(p.P0);

    let pin: P0_01<Disconnected> = gpio0.p0_01;

    // let gpio0_01_again = gpio0.p0_01; // Error, moved.
    let mut pin_input: P0_01<Input<Floating>> = pin.into_floating_input();
    if pin_input.is_high().unwrap() {
        // ...
    }
    let mut pin_output: P0_01<Output<OpenDrain>> = pin_input
        .into_open_drain_output(OpenDrainConfig::Disconnect0Standard1, Level::Low);
    pin_output.set_high().unwrap();
    // pin_input.is_high(); // Error, moved.

    let _pin2: P0_02<Output<OpenDrain>> = gpio0
        .p0_02
        .into_open_drain_output(OpenDrainConfig::Disconnect0Standard1, Level::Low);
    let _pin3: P0_03<Output<PushPull>> =
        gpio0.p0_03.into_push_pull_output(Level::Low);

    loop {}
}
  • پین‌ها Copy یا Clone را اجرا نمی‌کنند، بنابراین فقط یک نمونه از هر کدام می‌تواند وجود داشته باشد. هنگامی که یک pin از ساختار پورت خارج می شود، هیچ کس دیگری نمی تواند آن را بگیرد.
  • تغییر پیکربندی pin، نمونه pin ​​قدیمی را مصرف می‌کند، بنابراین نمی‌توانید پس از آن از pin قدیمی استفاده کنید.
  • این type یک مقدار state را نشان می‌دهد که در آن قرار دارد: به عنوان مثال. در این مورد، وضعیت پیکربندی یک پین GPIO. این state machine را در type system رمزگذاری می‌کند و تضمین می‌کند که سعی نکنید از pin به روشی خاص استفاده کنید بدون اینکه ابتدا آن را به درستی پیکربندی کنید. state transition غیرمجاز در زمان کامپایل شناسایی می‌شود.
  • می‌توانید is_high را در یک پین ورودی و set_high را در یک پایه خروجی فراخوانی کنید، اما برعکس امکان پذیر نیست.
  • بسیاری از HAL crateها از این الگو پیروی می‌کنند.