readonly?
Simen Kjaeraas
simen.kjaras at gmail.com
Tue Jul 10 13:52:40 PDT 2012
On Tue, 10 Jul 2012 21:27:54 +0200, Namespace <rswhite4 at googlemail.com>
wrote:
> Maybe D need's a readonly keyword.
> Sometimes i have a class which can take an object from everywhere to
> store it. So it can not be const, because i didn't just initialized it
> with a ctor.
> But i don't want to change the object, i only want to read or call const
> methods. What now?
> I'd suggest a readonly keyword for that.
>
> [code]
> class Foo {
> readonly:
> Bar _b;
>
> public:
> void SetBar(readonly Bar b) {
> _b = b;
> }
> }
> [/code]
>
> Or has D an alternative?
If Bar is a class, use std.typecons.Rebindable.
Otherwise, it's hairier. What should readonly mean?
From what I see, it provides const access, and is reassignable. This is
easily implemented in user code today:
import std.traits;
struct Readonly( T ) {
private T payload;
this( Unqual!T value ) {
payload = value;
}
auto opAssign( const T value ) {
payload = cast()value;
return this;
}
@property
const(T) get( ) const {
return payload;
}
alias get this;
} unittest {
struct S {
int n;
void foo() {}
void bar() const {}
}
Readonly!S a;
a = S( 3 );
assert( a.n == 3 );
assert( !__traits( compiles, a.n = 4 ) );
assert( !__traits( compiles, a.foo() ) );
assert( __traits( compiles, a.bar() ) );
}
More information about the Digitalmars-d-learn
mailing list