On 4/4/13 2:45 PM, Jeaye Wilkerson wrote:
Howdy,
I've been tinkering with Rust generics lately and, unfortunately, they
seem very limiting. Coming from C++, I expect from generics what
templates provide: A plug-in-this-type-in-and-see-if-it-compiles (
http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error )
approach.
Rust generics are more like C++13 templates with concepts, not like the
templates that exist today. This allows templates to be typechecked at
the time you write them, not when you instantiate them. You can use
macros for the more unstructured approach.
It seems to me that trait-based generics are not really
generic at all; they're polymorphic. Take the following:
impl<T: num::Zero> Foo
{
pub fn zero() -> Foo<T>
{
Foo { bar: num::Zero::zero() }
}
}
Often times in C++, a programmer will want to restrict the types that
can go into a function. C++ traits make this kind of messy, so I
appreciate the approach here. Still, getting zero from T uses a
polymorphic num::Zero::zero(), instead of a generic T::zero().
This is something that Niko addresses in these posts:
http://smallcultfollowing.com/babysteps/blog/2013/04/02/associated-items/
http://smallcultfollowing.com/babysteps/blog/2013/04/03/associated-items-continued/
Allowing `T::zero()` could be done and has advantages and disadvantages,
but I've shied away from it so far, because of the problems with types
that aren't paths (`<~[int]>::empty()`) and ambiguities (what if there
are two traits that define `zero()`?)
Furthermore, what if one wanted to create also a "pub fn one() ->
Foo<T>" function; you then need "num::Zero::zero() + 1", but does that
work as expected?
You would need another bound on the function. Or just use the Num trait,
as below.
Another problem that arises is the massive number of
trait bounds that an arithmetic (or something else) function might need
to simply work.
This is because trait inheritance is currently broken. Once it's fixed,
you'll just be able to use the Num trait and you'll get all of the
arithmetic with one short trait bound.
Patrick
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev