5 ms·
I have heard about Rust. But I wonder if you can do something that a OO programmer (like me :) would call "string subclasses" so you do not manipulate a generic
by lolive 8y ago
I have heard about Rust. But I wonder if you can do something that a OO programmer (like me :) would call "string subclasses" so you do not manipulate a generic type called string, but a meaningful subclass such as "FirstName" or "LastName", or "TownName".
- steveklabnik 8y agoYou wouldn’t do it as a “subclass”, as Rust doesn’t have classes or inheritance. You’d use the “new type pattern”, which is like a named 1-tuple: struct FirstName(String);
- lolive 8y agois this type interchangeable with String?
- steveklabnik 8y agoNot exactly. That is, you can't pass it directly to a function that takes a String, but if we made the inner string public, we could extract it with two characters. If we don't want to make it public, we can write an accessor as well, etc.
- lolive 8y agoAs far as i understand, Rust is strongly typed, has generics and no type erasure. I also suppose String is some kind of a primitive type. Could it be possible to make it parametrizable, so we can manipulate a String<FirstName> as a String, but the compiler will never confound it with (for example) String<LastName>.
- steveklabnik 8y agoString is a library type, not a primitive type. You could write your own string parameterized in this way, but it would be incompatible with the standard library String and so you’d need the same conversion steps.
- lolive 8y agoWhat would happen if the Rust core team decided to parametrize String? Would it work with legacy code? (that creates something like String<?> and consume String<?>).
- steveklabnik 8y agoIt cannot be done in a backwards compatible way with today’s language features.
- vram22 8y agoI'm not the person you asked, but I don't think domain-specific user-defined types (whether defined as subclasses or subranges (see Pascal) of existing language types, or another method as Steve said), are supposed to be automatically interchangeable or equivalent to the existing type they are derived from (without a cast or conversion of some kind), otherwise it would defeat the purpose, which is better type or range checking.