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