3 ms·
> The String type _is_ a newtype that […] It is not. `NonZeroUsize` is (though in Rust "newtype" is only a pattern or idiom), and its definition (inside of a m
by chrisoverzero 6y ago
> The String type _is_ a newtype that […]
It is not. `NonZeroUsize` is (though in Rust "newtype" is only a pattern or idiom), and its definition (inside of a macro which provides numeric newtypes a bunch of `impl`s) is:
pub struct NonZeroUsize(usize);
But here's String:
pub struct String {
vec: Vec<u8>,
}
…which is a normal `struct` _containing_ a named `Vec<u8>`. Of the types you mentioned, only `NonZeroUsize` conforms to the pattern.
- steveklabnik 6y agoDo you feel that just because the inner value is named, rather than unnamed, it’s no longer a new type? Trying to figure out what line is crossed here.
- chrisoverzero 6y agoI'm going by the Rust documentation: https://doc.rust-lang.org/stable/rust-by-example/generics/new_types.html https://doc.rust-lang.org/stable/rust-by-example/generics/ne... (I was going to be cheeky here, but Git history shows you didn't write any of this part.)
- steveklabnik 6y agoHehe yeah, I mean, I am not 100% sure myself, which is why I asked. There's no real difference between a 1-tuple struct and the regular struct, other than the name. So to me, it feels like either are both newtypes. But, I guess I could see some sort of argument the other way too.
- lexi-lambda 6y agoIn Haskell, a newtype can be a single-field record with a named field, so from a Haskell perspective, I would definitely consider both of them “newtypes.”
- aliceryhl 6y agoThe point of a newtype is that it allows you to create a wrapper around some other type for one of the following two purposes: 1. Marking the kind of data to prevent mixing up values of different kinds. (e.g. Email) 2. Outlawing some of the values of the underlying type. (e.g. OneToFive) I do not think it being a tuple-struct or not is important at all when deciding whether something uses the newtype pattern, as long as it has a single field.