4 ms·
There are a few more fundemental missing pieces for me: - It's impossible to describe a type that "implements trait A and may or may not implement trait B" -
by nicoburns 4y ago
There are a few more fundemental missing pieces for me:
- It's impossible to describe a type that "implements trait A and may or may not implement trait B"
- It's impossible to be generic over a trait (not a type that implements a trait, the trait itself)
- tialaramex 4y ago> It's impossible to describe a type that "implements trait A and may or may not implement trait B" How is this different from just describing a type that only "implements trait A" ?
- nicoburns 4y agoIt would allow you to call a function to check for trait B and downcast to "implements trait A and B" in the case that it does implement the trait.
- merely-unlikely 4y agoI’m still learning the language but couldn’t you use an enum containing two types to accomplish the same thing?
- nicoburns 4y agoYou can if you know all of the possible types in advance. But if you want to expose this as an interface from a library that allows users to provide their own custom implementation then you need to use traits.
- tialaramex 4y agoIt seems like a way to ask "Can this thing implement X and if so how?" from say the Any trait would be what you want here, I have no idea how hard that would be to deliver but I also don't see how the previous trait thing is relevant, like, why do we need to say up front that maybe we will care whether trait B is implemented?
- insanitybit 4y ago> - It's impossible to describe a type that "implements trait A and may or may not implement trait B" So, specialization? Or something else? I haven't found a need for specialization. I remember when I came from C++ I had a hard time adjusting to "no specialization, no variadics" but idk I haven't missed it in years. > - It's impossible to be generic over a trait (not a type that implements a trait, the trait itself) Not sure I understand.
- nicoburns 4y ago> So, specialization? Basically yes. But that works with dynamic dispatch (trait objects) as well as static dispatch (generics). > Not sure I understand. A specific pattern I'd like to be able to represent is: trait AlgorithmAInputData { ... } trait AlgorithmA { trait InputData = AlgorithmAInputData; ... } trait DataStorage<trait AlgorithmA> { type InputData : Algorithm::InputData; fn get_input_data() -> InputData; } fn compute_algorithm_a<Storage: DataStorage<AlgorithmA>>() { ... }