内容简介:We all know Rust's trait system is Turing complete, so tell me, why aren't we exploiting this??? Who needsHonestly, I was too preoccupied with the fact that I could to stop to think whether I actually should.Believe it or not,
trait_eval
We all know Rust's trait system is Turing complete, so tell me, why aren't we exploiting this??? Who needs const-fn
when we've got a crate like this?!
Honestly, I was too preoccupied with the fact that I could to stop to think whether I actually should.
Believe it or not, I even wrote docs for this .
Example
Here's an eminently readable example where we play FizzBuzz at compile-time!
trait FizzBuzzType { fn show() -> String; // Don't worry about this -- it's just so we can print the result } struct Fizz; impl FizzBuzzType for Fizz { fn show() -> String { "Fizz".to_string() } } struct Buzz; impl FizzBuzzType for Buzz { fn show() -> String { "Buzz".to_string() } } struct FizzBuzz; impl FizzBuzzType for FizzBuzz { fn show() -> String { "FizzBuzz".to_string() } } impl<T: Nat> FizzBuzzType for T where T: Eval, <T as Eval>::Output: Display, { fn show() -> String { format!("{}", T::eval()) } } trait FizzBuzzEval: Nat { type Result: FizzBuzzType; } impl<T: Nat, Mod3: Nat, Mod5: Nat, ShouldFizz: Bool, ShouldBuzz: Bool, ShouldFizzBuzz: Bool, DidBuzz: FizzBuzzType, DidFizz: FizzBuzzType, DidFizzBuzz: FizzBuzzType> FizzBuzzEval for T where T: Mod<Three, Result = Mod3> + Mod<Five, Result = Mod5>, Mod3: Equals<Zero, Result = ShouldFizz>, Mod5: Equals<Zero, Result = ShouldBuzz>, ShouldFizz: AndAlso<ShouldBuzz, Result = ShouldFizzBuzz>, (Fizz, T): If<ShouldFizz, Result = DidFizz>, (Buzz, DidFizz): If<ShouldBuzz, Result = DidBuzz>, (FizzBuzz, DidBuzz): If<ShouldFizzBuzz, Result = DidFizzBuzz>, { type Result = DidFizzBuzz; } assert_eq!(<One as FizzBuzzEval>::Result::show(), "1"); assert_eq!(<Two as FizzBuzzEval>::Result::show(), "2"); assert_eq!(<Three as FizzBuzzEval>::Result::show(), "Fizz"); assert_eq!(<Four as FizzBuzzEval>::Result::show(), "4"); assert_eq!(<Five as FizzBuzzEval>::Result::show(), "Buzz"); assert_eq!(<Six as FizzBuzzEval>::Result::show(), "Fizz"); assert_eq!(<Seven as FizzBuzzEval>::Result::show(), "7"); assert_eq!(<Eight as FizzBuzzEval>::Result::show(), "8"); assert_eq!(<Nine as FizzBuzzEval>::Result::show(), "Fizz"); assert_eq!(<Ten as FizzBuzzEval>::Result::show(), "Buzz"); type Fifteen = <Three as Times<Five>>::Result; assert_eq!(<Fifteen as FizzBuzzEval>::Result::show(), "FizzBuzz"); // !!!
Contributing
Please, for the love of God, don't use this crate. If you must contribute, open a PR.
以上所述就是小编给大家介绍的《FizzBuzz purely in Rust's trait system》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。