#traits #impl #bindings #macro #let-static-const #stabilized

nightly macro bind_it

A macro that allows impl traits in let/static/const bindings until they actually stabilized

3 releases

0.1.3 Apr 1, 2022
0.1.1 Apr 1, 2022
0.1.0 Apr 1, 2022

#1735 in Procedural macros

MIT license

7KB
104 lines

Description

A macro that allows using impl traits in bindings. Currently supported statements: let, const (with some limitations mentioned below), static. This crate will be replaced by impl_trait_in_bindings feature in future, but there is still a long way to reimplement and stabilize it.

Example

#![feature(type_alias_impl_trait)]

#[macro_use]
extern crate bind_it;

fn main() {
    bind_it!( let x: impl std::fmt::Display = true; );

    // fails, even x variable is initialized with a boolean, its type is hidden behind `Display` trait,
    // and the only thing that we can do - display x
    // assert!(x);

    // works
    println!("{x}")
}

How it works?

Ez!

Minimal compiler version

rustc 1.61.0-nightly (c5cf08d37 2022-03-30) with #![feature(type_alias_impl_trait)] enabled

Limitations

  • Currently only one item per macro supported
  • Associated consts are not yet supported
  • Only one type per impl Trait allowed. tl;dr, you can't write
bind_it! {
    let _: impl std::fmt::Display = if rand::random() > 0.5 {
            "qwe"
        } else {
            5u8
        };
};

Despite of that fact that both &str and u8 implement Display trait, we need to determine ONE concrete type in the compile time.

Dependencies

~1.3–1.8MB
~40K SLoC