Rant after trying Rust a bit
Dicebot via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 23 08:03:53 PDT 2015
On Thursday, 23 July 2015 at 14:15:30 UTC, Andrei Alexandrescu
wrote:
> On 7/23/15 5:07 AM, Walter Bright wrote:
>> On 7/22/2015 11:47 PM, Jacob Carlborg wrote:
>>> On 2015-07-22 20:47, 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
>>>
>>> I completely agree and don't really like the approach D has
>>> implemented template
>>> constraints. Yeah I know, Andrei will destroy this :)
>>
>> Consider that template constraints can be arbitrarily complex,
>> and can
>> even check behavior, not just a list of function signatures
>> ANDed
>> together. Turns out many constraints in Phobos are of the form
>> (A || B),
>> not just (A && B).
>
> Agreed. And that's just scratching the surface.
It is definitely a big issue for designing more advanced generic
libraries and one of my major issues with Rust but you need to
realize that vast majority of application domain usage of such
constraints is simply ensuring list of methods. You may be biased
by too much standard library development ;)
At the same time one HUGE deal breaker with rust traits that
rarely gets mentioned is the fact that they are both constraints
and interfaces at the same time:
// this is template constraint, it will generate new `foo` symbol
for each new T
fn foo <T : InputRange> (range : T)
// this use the very same trait definition but creates "fat
pointer" on demand with simplistic dispatch table
fn foo (range : InputRange)
It kills all the necessity for hacks like RangeObject and is
quite a salvation once you get to defining dynamic shared
libraries with stable ABI.
This is probably my most loved feature of Rust.
> Serious question: how do you express in Rust that a type
> implements one trait or another, then figure out statically
> which?
As far as I understand current idiomatics, you don't. Code that
tries to use functions that are not ensured by trait will simply
not compile and for any complicated generic programming one is
supposed to use macros. Rust does not have templates, only
trait-restricted generics.
I find it terribly unproductive but it seems to appeal to certain
developer mindset, primarily the ones that associate "templates"
with "C++ templates".
More information about the Digitalmars-d
mailing list