On Wed, Jun 10, 2020 at 10:58:57PM -0600, Jonathan M Davis via 
Digitalmars-d-learn wrote:
[...]
> As things stand, @property has no real practical purpose but
> frequently gets used to indicate that it's the intention of a
> function's author for it to be used as if it were a variable. I
> suspect that it's also frequently misunderstand that it's required if
> you want to call a function without parens. So, you're likely to see
> @property in quite a lot of D code, but ultimately, all it's really
> doing is serving as documentation of the author's intent and screwing
> up metaprogramming.
[...]

Ironically, just today I ran into this corner case where @property
actually became a solution to a real problem:

        //-----module1.d------
        auto someGenericFunc(T)(T t) {
                ...
                static if (is(typeof(T.init.method) : T)) {
                        R someRange = ...; // ElementType!R == T
                        auto value = someRange.map!(e => e.method);
                }
                ...
        }

        //-----module2.d------
        struct MyType {
                ...
                auto method()() {
                        return ...;
                }
                ...
        }

        //------module3.d-----
        import module1;
        import module2;
        auto someFunc(...) {
                auto result = someGenericFunc!MyType;
        }

This was failing compilation, because when MyType.method is a template,
the static if condition in module1 fails.  Adding @property to
MyType.method tells the compiler that `T.init.method` is intended to
refer to the return value rather than the template function itself, and
thus neatly solves the problem.


T

-- 
It's amazing how careful choice of punctuation can leave you hanging:

Reply via email to