On 09/26/2014 10:16 AM, AsmMan wrote:

> I know I can combine it by making an extra variable plus a property like
> this:

That's the proper way of doing it in D.

If it's too much work, it is possible to take advantage of mixins to reduce the boilerplate. I found the following code among my D samples; it must have been found on these forums.

Defining without "set" would disallow the setter:

    alias AutoImplementedProperty!(string, "get") title;

The code:

import std.stdio;

class Bar
{
    alias AutoImplementedProperty!(string, "get", "set") title;
}

template AutoImplementedProperty(T, args...)
{
    import std.typetuple;
    @property
    {
        private T _name;
        static if (args.length)
        {
            static if (staticIndexOf!("get", args) > -1)
            {
                public T AutoImplementedProperty()
                {
                    return _name;
                }
            }

            static if (staticIndexOf!("set", args) > -1)
            {
                public void AutoImplementedProperty(T value)
                {
                    _name = value;
                }
            }

        }
    }
}

void main(string[] args)
{
    Bar a = new Bar();
    a.title = "asf";
    writeln(a.title);

    return;
}

> I wanted to do that without this a_ extra variable

If the value is set only once and it is known during construction, it is indeed mark the variable public const:

import std.stdio;

class Foo
{
    public const int a;

    this (int x)
    {
        a = 2 * x;
    }
}

void main()
{
    Foo f = new Foo(21);
    writeln(f.a); // output value of a

    Foo f2 = f;    // copy works
    f2 = f;        // assignment works

    // f.a = 10; // compile error: a is readonly outside Foo's methods.
}

Ali

Reply via email to