On Monday, 12 December 2011 at 16:09:03 UTC, Andrei Alexandrescu wrote:
On 12/12/11 9:29 AM, Jakob Ovrum wrote:
On Monday, 12 December 2011 at 15:14:02 UTC, Andrei Alexandrescu wrote:
On 12/12/11 9:07 AM, Jakob Ovrum wrote:
If the programmer sees just "r.save", he
doesn't know whether it's a field or a property, and he shouldn't need to know, it should be fast and cheap, and return a consistent value. As
far as I know, this isn't always true for save

Why? Save does behave like a field for the vast majority of structs.

Andrei

But save is an abstract interface function, its signature should reflect
all possible implementations.

Same goes for many properties.

Andrei

This is true, and many functions marked @property arguably shouldn't be. I think it's a little like the reason std.container.SList doesn't have a `length` property: the O(n) complexity doesn't match the interface `length` exposes (although formalised only in documentation/convention, not code).

If the standard library is allowed to assume `r.save` is a cheap operation, in the same fashion it's allowed to assume this(this) is cheap, then by all means, it makes sense as a property. The only remaining arguments against it are purely about the name, and I actually don't think that's relevant.

And just like you can still make a computationally expensive this(this) when absolutely necessary, you can do the same with save. If most reasonable uses of save have trivial performance, it might as well be a property.

I'm still a beginner with ranges, but by my understanding and by what some people made it sound like, reasonable uses of save include some which are non-trivial. If this is true, then removing @property from save encourages people to think more about what using it might mean for the code they are writing, which is definitely important.

Reply via email to