▲ | zk4x 3 days ago | ||||||||||||||||||||||||||||||||||||||||
This. Traits and macros are two real problems with rust. Orphan rule is one, but also const, async and unnamable types (mostly closures). These barely work with traits or do not work at all. If rust did not have closures, it'd be a lot simpler to solve these. Is it so hard to just create a normal function instead of closure? Perhaps we need to go back to the basics a bit? What is a trait? 1. A set of functions, associated types and generic types 2. A marker/tag (e.g. Send, Sync) Orphan rules do not seem to be problem for marker traits. Library authors must be responsible for enforcing whether their types are Send/Sync, etc or not. As for normal traits, it's too late for rust, but I'd just limit traits to being only sets of function definitions, e.g. trait Iterator = fn next<T>(&mut self) -> Option<T> + fn len(&self) -> usize Then adding set operations (and, or, xor, not) for traits would be pretty easy, keeping most of power for defining generics. More importantly traits could be just aliases and two traits with the same set of functions would be equal. This solves orphan problem - you would not need to import or export traits, it would be just normal resolution of functions. Do I call this function from crate A, or crate B? That's a solved problem. | |||||||||||||||||||||||||||||||||||||||||
▲ | pyrale 3 days ago | parent | next [-] | ||||||||||||||||||||||||||||||||||||||||
The hard problem is not sharing the trait, but sharing the trait instance. With your solution, if too modules define traits with identical type signatures but different implementations, it would be impossible for the compiler to decide which impl to use. | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
▲ | dgfitz 3 days ago | parent | prev [-] | ||||||||||||||||||||||||||||||||||||||||
> trait Iterator = fn next<T>(&mut self) -> Option<T> + fn len(&self) -> usize This is why I don’t have interest in learning rust. When I see people write c++ code like this I wonder why they feel the need to be so clever. That is an abysmal thing to maintain. | |||||||||||||||||||||||||||||||||||||||||
|