Hello,
Using properties allows travesting a method call into direct data access. What
if the underlying member actually is plain data? Would it be possible to
provide a real data member where the language expects a property (for instance
as range empty & front properties)?
Is there any difficulty for the compiler to check whether a data member of the
same name and correct type exists? To help it, we could mark said data member
with an @property hint. For instance:
struct String {
char[] cs;
private uint index = 0; // for traversal
@property char front;
@property bool empty;
this (string characters) {
this.cs = characters.dup;
this.empty = (this.cs.length == 0);
if (this.cs.length > 0)
this.front = this.cs[0];
}
@property void popFront () {
++ this.index;
this.empty = (this.index >= this.cs.length);
if (this.index < this.cs.length)
this.front = this.cs[this.index];
}
}
unittest {
auto s = String("abc");
// works fine
while (! s.empty) {
auto c = s.front;
write(c,' ');
s.popFront;
}
writeln();
// works not
//~ foreach (char c ; s) write(c,' ');
writeln();
}
Here, popFront does not only advance, it correctly sets empty and front, so
that a single method is needed. But the language expects a method-property
(actually, it complains for missing opApply *).
I'm a bit troubled to implement methods where plain data does the job and
conceptually better matches my model (maybe it's only me: I wish the code to
mirror my views).
[Note: I do not mean at all the current imput-range model is overkill or
anything similar. It is certainly more general as is, and I do not have enough
various use cases to give any opinion on that! The given example is just that:
an example.]
Denis
(*) Would be good to update the error message:
Error: no property 'opApply' for type 'String'
Error: opApply() function for String must return an int
-->
Error: type String does not provide any iteration method.
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com