how to assign to shared obj.systime?
Arafel
er.krali at gmail.com
Tue Jul 14 07:05:43 UTC 2020
On 14/7/20 8:13, Kagamin wrote:
> ---
> import std;
>
> shared class TimeCount {
> void startClock() {
> auto me = cast()this;
> me.startTime = Clock.currTime;
> }
> void endClock() {
> auto me = cast()this;
> me.endTime = Clock.currTime;
> }
> void calculateDuration() {
> auto me = cast()this;
> me.elapsed = me.endTime - me.startTime;
> }
>
> private:
> SysTime startTime;
> SysTime endTime;
> Duration elapsed;
> }
> ---
> And this is shorter than your unshared member specification.
It won't work if you need to do it inside a struct instead of a class,
because you'll get a copy:
```
import std;
shared struct S {
void setA (int _a) {
auto me = cast() this;
me.a = _a;
}
int a;
}
void main() {
shared S s;
writeln("Before: ", s.a); // 0
s.setA(42);
writeln("After: ", s.a); // still 0
}
```
That said, `with (cast() this) { ... }` *will* work, because there's no
copying. This is a really nice idiom that I didn't know and that I'll
use from now on.
*However*, for this to work, you shouldn't use `shared` member variables
unless absolutely necessary, much less whole `shared` classes/structs,
and only declare the individual methods as shared, because casting away
`shared` from `this` will only peel the external layer:
```
import std;
struct S {
SysTime a;
shared SysTime b;
synchronized shared void setIt(SysTime t) {
with(cast() this) {
a = t;
// b = t; // FAILS, `b` is still `shared` even for
non-shared `S`
}
}
}
```
Also, I'm pretty sure there are still corner cases when you have to nest
data structures, but so far this strategy seems good enough.
More information about the Digitalmars-d-learn
mailing list