Read Once then reset/init value?
Simen Kjærås
simen.kjaras at gmail.com
Wed Oct 30 12:59:48 UTC 2019
On Wednesday, 30 October 2019 at 11:53:42 UTC, Jacob Carlborg
wrote:
> On 2019-10-30 00:28, Simen Kjærås wrote:
>
>> Something like this?
>>
>> T readOnce(T)(ref T value) {
>> auto tmp = value;
>> value = T.init;
>> return tmp;
>> } unittest {
>> int i = 3;
>> assert(i.readOnce == 3);
>> assert(i == 0);
>> }
>
> Perhaps better to encapsulate it in a struct to avoid someone
> accessing the value directly.
Quite possibly, but the post was somewhat low on details, and
encapsulating it like that does put certain limits on how it can
be used, so it's not necessarily the best idea.
FWIW, here's one possible way to do it with a struct:
struct Readonce(T, T defaultValue = T.init) {
private T value;
alias get this;
T get() {
auto tmp = value;
value = defaultValue;
return tmp;
}
void get(T newValue) {
value = newValue;
}
this(T newValue) {
value = newValue;
}
}
unittest {
Readonce!(int, -1) a = 3;
assert(a == 3);
assert(a == -1);
a = 3;
assert(a == 3);
assert(a == -1);
}
--
Simen
More information about the Digitalmars-d-learn
mailing list