Rant after trying Rust a bit

jmh530 via Digitalmars-d digitalmars-d at puremagic.com
Wed Jul 22 16:25:55 PDT 2015


On Wednesday, 22 July 2015 at 18:47:33 UTC, simendsjo wrote:
>
> Traits
> ------
> I think the ability to express an interface without buying into 
> inheritance is the right move. The alternative in D is 
> specifying the behavior as a template and verifying the 
> contract in a unittest for the type.

Rust only has structs. I'm not as familiar with them so it's not 
as clear how they overlap with D's structs and classes. It seems 
like you can put Rust structs on the stack or heap.

Others have already commented on how you can basically accomplish 
the same thing with templates, static ifs, and assert. That was 
my first thought as well. Nevertheless, I would add that Rust's 
ability to use multiple traits in the template constraints is a 
positive.

However, it seems like the essence of a trait in Rust is forcing 
some user-defined type to implement some functionality. That 
sounds a lot like an interface in D to me. In fact, Rust's traits 
seem different from Scala and PHP traits in that I don't see any 
examples with them using implementation. The two biggest 
differences between Rust traits and D interfaces are 1) 
inheritance of Rust traits (to my knowledge D does not have 
inheritance for interfaces, am I wrong?), 2) Rust traits can be 
easily used in template constraints. Those both seem like 
positives to me, though I'm not sure if they can be easily 
changed in D.

If you look at the Rust book's main example on traits. They use 
them to implement a print_area function that can only be called 
with structs that have a trait HasArea defined. Classes in pretty 
much any OOP language could use inheritance to implement a 
simpler version where print_area is a method instead of a 
separate function.

To play devil's advocate, writing a bunch of code with 
templates/static ifs/assert is definitely more confusing for 
someone new to the language than Rust's traits are. A lot of the 
D code makes quite a bit of sense when you understand how the 
different ideas combine together, but it takes a while to figure 
it out.

If traits were deemed important enough to add to D, I would 
suggest just extending interfaces so that they have inheritance 
and can be easily used in template constraints. I would be more 
interested in seeing some of these OOP features come to structs, 
but I have no idea how much work that requires. I feel like alias 
this is hacky compared to real inheritance.

>
> Algebraic data types
> --------------------
> Haven't looked into `Algebraic!`, so I won't start bashing D 
> here :) But given the lack of pattern matching, I doubt it will 
> be as pretty as Rust.

It seems like D's Algebraic does not allow for recursive 
Algebraic Types currently, whereas Rust's does. I'm honestly not 
that familiar with the concept. Seems cool, but I'm not sure I've 
ever really needed it.

>
> Borrowing
> ---------
> This is probably the big thing that makes Rust really 
> different.  Everything is a resource, and resources have an 
> owner and a lifetime. As a part of this, you can either have 
> multiple aliases with read-only references, or a single 
> reference with a writeable reference. I won't say I have a lot 
> of experience with this, but it seems like it's not an 
> extremely unergonomic trade-off. I cannot even remotely imagine 
> the amount of possible compiler optimizations possible with 
> this feature.
>

I feel like it's hard to separate borrowing from Rust's variety 
of pointers (& is borrowed pointer, ~ is for unique pointer, @ is 
for managed pointer). Nevertheless, I think having them part of 
the language with relatively straightforward syntax is a positive 
for Rust. Also, my understanding is that they are checked at 
compile-time for safety (at least unique and managed).

However, I feel like borrowing and lifetimes have a bit of a 
learning curve to them. I've read a few tutorials without a good 
sense of them. I would probably need to program a bit in it to 
grok it. I think part of it is that Rust has = potentially 
meaning copy or move depending on whether it is defined. Perhaps 
they need a separate move assignment, like <- and -> or something 
(to steal syntax from R, even though that's not what <- and -> do 
in R).


More information about the Digitalmars-d mailing list