Rust generic type alias
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Rust currently includes feature-gated support for type parameters that specify a default value. This feature is not well-specified. The aim of this RFC is to fully specify the behavior of defaulted type parameters:.
The Rust Programming Language
Points 2 and 4 extend the current behavior of type parameter defaults, aiming to address some shortcomings of the current implementation. Often, these two scenarios occur at the same time. A classic historical example is the HashMap type from Rust's standard library. This type now supports the ability to specify custom hashers. For most clients, this is not particularly important and this initial versions of the HashMap type were not customizable in this regard.
But there are some cases where having the ability to use a custom hasher can make a huge difference. Having the ability to specify defaults for type parameters allowed the HashMap type vocabolario gergale add a new type parameter H representing the hasher type without breaking any existing clients and also without forcing all clients to specify what hasher to use.
However, customization occurs in places other than types. Consider the function range. In early versions of Rust, there was a distinct range function for each integral type e. These functions were eventually consolidated into a single range function that is defined generically over all "enumerable" types:. However, the generic version does have the downside that when the bounds of the range are integral, inference sometimes lacks enough information to select a proper type:. This RFC describes how to integrate default type parameters with inference such that the type parameter on range can specify a default uintfor example :.
Using this definition, a call like range 0, 10 is perfectly legal. If it turns out that the type argument is not other constraint, uint will be used instead.
Without defaults, once a library is released to "the wild", it is not possible to add type parameters to a type without breaking all existing clients. However, it frequently happens that one wants to take an existing type and make it more flexible that it used to be. This often entails adding a new type parameter so that some type which was hard-coded before can now be customized.
Defaults provide a means to do this while having older clients transparently fallback to the older behavior. Defaults can be placed on any type parameter, whether it is declared on a type definition structenumtype alias typetrait definition traittrait implementation implor a function or method fn. Once a given type parameter declares a default value, all subsequent type parameters in the list must declare default values as well:.
The default value of a type parameter X may refer to other type parameters declared on the same item.GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community. Already on GitHub? Sign in to your account. Tracking issues are used to record the overall progress of implementation. They are also uses as hubs connecting to other relevant issues, e. A tracking issue is however not meant for large scale discussion, questions, or bug reports about a feature.
Instead, open a dedicated issue for the specific matter and add the relevant feature gate label.
It appears that the current implementation does not trigger any "private type in public interface" errors, for the following code playground :. EDIT: Opened Inlanded onwritten by Centril and reviewed by varkor3 ICEs were closed with reproducer tests added. Inlanded onwritten by JohnTitor and reviewed by Centril1 ICE was closed with a reproducer test added.
Concern: the defining implementation cannot currently be a struct field. In part this overlaps with Aaron 's concern of being unable to use the type within the defining scope except in defining uses.
Concern: it is not possible to define type aliases without trait bounds using the current syntax because type A; is not an existential type. Although unbounded existentials without even Drop are useless, it would be nice for them to be legal in the same way that a spurious let binding or unused struct field is legal.
Unfortunately I see no solution to this using the RFC-proposed syntax. Concern: scopes. I believe it was agreed that the details of an existential type should not cross API boundaries i. On the other hand, I believe it would be useful for the type details to be able to escape the defining scope within the same module, the same as non- pub types are accessible within the same module. This would allow struct literal macros to be significantly more useful.
On the other hand, I believe it would be useful for the type details to be able to escape the defining scope. Thanks Centril for reminding me of I'm still unsure whether type details should be available outside the defining scope the RFC is not really clear.
Sized is an interesting type bound, but your test cases should really include the following currently passes :.Note, however, that this is an aliasnot a new type entirely.
This compiles without error. Values of a Num type are the same as a value of type i32in every way. You can use tuple struct to really get a new type. This is commonly used in the standard library to create custom errors for each subsection. For example, io::Result.
Toggle navigation. Introduction 2. Getting Started 3. Tutorial: Guessing Game 4.
Subscribe to RSS
Syntax and Semantics 4. Variable Bindings 4. Functions 4. Primitive Types 4. Comments 4. Loops 4. Vectors 4. Ownership 4. References and Borrowing 4. Lifetimes 4. Mutability 4. Structs 4. Enums 4. Match 4. Patterns 4. Method Syntax 4. Strings 4. Generics 4. Traits 4. Drop 4.GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community. Already on GitHub? Sign in to your account. The following code playground :. This is incorrect, since the Foo impl uses it and it can be unwieldy to write it out otherwise.
This looks like a similar case: type aliases used for trait bounds on inherent impl are not considered used: playground. I'm still having this issue on rustc 1. StructAlias is warned as never used yet used in the requirements of the AssociatedType of Trait2. This isn't the same as the original issue, so let's open a new one there are already related issues, so it might be worth checking if this is already open elsewhere. Do you think it's the same as ? Elrendio : that's the one I was thinking of, thanks.
I've added your example there — I think they probably are the same bug but if not, we can split out another issue then. Skip to content. Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up. New issue. Jump to bottom. Unused warning for type alias doesn't take into account inherent impls. Labels A-lint C-bug T-compiler. Copy link Quote reply. IslandUsurper mentioned this issue Apr 24, Using a type alias in an impl block header doesn't mark it as being used This comment has been minimized.
Sign in to view. This looks like a similar case: type aliases used for trait bounds on inherent impl are not considered used: playground! RalfJung mentioned this issue Oct 16, Incorrect warning: type alias is never used Wrong unused warning for type alias Add a regression test for rust-lang This commit was created on GitHub. Hello, I'm still having this issue on rustc 1.
Thanks a lot! I'm still having this issue Please provide a minimized example that demonstrates the problem. Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment.You just want to see code? I think about it as: using a synonym for a type. Especially when generics and lifetimes have to be added aswell. Unimportant background story: In my case, I wanted to write a little parser that takes in some code and spits out xml.
To figure out which function to call, I wanted to look or peek what the next item was, without picking it of the sequence. This is what a Peekable allows you to do. This might not sound too difficult. But boy, did that type signature get loooooong. It took some help from stackoverflow to finally get a working type signature for my use case. And the final function definition, with that elongated type signature, looked something like this:. Shocking, right?! Though this is not really an advantage yet, you might already see the potential.
The above example is pretty close to what an iterator type alias could look like. But we need lifetime annotations here. The details of lifetimes are beyond the scope of this post. But now we start to juice it up and alias the Peekable type, by using our fresh MyIterator inside of it.
A brief explanation about what is going on. And thats it! Type aliases are a fantastic feature in RUST to simplify complex type signatures. This is useful if you have to repeat that signature in several places. AND you can often express your intend a lot better, which makes the code much more understandable. This post has only scratched the surface I myself have just recently learned about this topic.
How to use type aliases in RUST
But I hope I have peeked you interest no pun intended. Please feel free to send me an email or connect with me on twitterif you have any comments, corrections or suggestions or if you liked this post. Skip to content Home about my blog disclaimer rad resources blasting basics convincing code editors practice your coding skills with celebrant code challenges precious podcasts. Search for:. What is a type alias? Why is a type alias even useful?
It comes in handy for complex type signatures. Especially if this type signature is used in more than one place. It can make your intend much clearer and therefore makes the code more readable. When do those complex type signatures occur?
MyTypewhere the first letter is uppercase by convention Assign a valid, existing type to it.A type alias defines a new name for an existing type. Type aliases are declared with the keyword type. Every value has a single, specific type, but may implement several different traits, or be compatible with several different type constraints. For example, the following defines the type Point as a synonym for the type u8, u8the type of pairs of unsigned 8 bit integers:.
Introduction 1. Notation 2. Lexical structure 2. Input format 2. Keywords 2. Identifiers 2. Comments 2. Whitespace 2. Tokens 2. Paths 3. Macros 3. Macros By Example 3.
Procedural Macros 4. Crates and source files 5.
The dark mode beta is finally here. Change your preferences any time. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. You need to do this command line: rustup default nightly and rustup default stable to go back to your previous configurtion.
I Would like to define a type from another type. If I create a type from a const generic type See 1it works. But if I create a const generic type from another const generic type, it doesn't work see 2.
I think you do not have to spell out the const parameter names just as you do not spell out type parameter names :. Learn more. Asked 1 month ago. Active 1 month ago. Viewed 53 times. You need to do this command line: rustup default nightly and rustup default stable to go back to your previous configurtion I Would like to define a type from another type. But if I create a const generic type from another const generic type, it doesn't work see 2 What should I do?Generics - Rust
Pierre-olivier Gendraud. Pierre-olivier Gendraud Pierre-olivier Gendraud 1 1 silver badge 7 7 bronze badges. Now I've modified my question. Active Oldest Votes. I think you do not have to spell out the const parameter names just as you do not spell out type parameter names :! Sign up or log in Sign up using Google. Sign up using Facebook.
Sign up using Email and Password. Post as a guest Name. Email Required, but never shown. The Overflow Blog. Featured on Meta. Community and Moderator guidelines for escalating issues via new response….
Feedback on Q2 Community Roadmap. Technical site integration observational experiment live on Stack Overflow. Dark Mode Beta - help us root out low-contrast and un-converted bits. Related Hot Network Questions.