Can I make a variable public and readonly (outside where was declared) at same time?
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Sep 26 10:33:59 PDT 2014
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
More information about the Digitalmars-d-learn
mailing list