array inside a class + alias this + filter -> clears the array.
Paul Backus
snarwin at gmail.com
Wed Jul 7 17:10:01 UTC 2021
On Wednesday, 7 July 2021 at 16:20:29 UTC, realhet wrote:
> Hi,
>
> I wanted to make a container class that exposes its elements
> using a simple "alias this", but getting weird errors:
>
> I test with the std.algorithm.filter template function.
>
> 1. when I use "alias this" on a function that returns a slice,
> making the internal array unreachable, filter just can't
> compile.
> 2. when I expose the array as it is, filter deletes the array
> after it returns.
>
> My goal is to make a class, which acts like an array, but also
> having member functions to add/remove/find its items. On top of
> that this class has an owner (a database table thing) too.
In general, it is not a good idea to have your container class
also function as a range, for exactly this reason. Instead, your
container class should have a method that returns a range over
its elements, with the range being a separate object.
The conventional way to do this is to overload `opIndex`:
```d
class C
{
private int[] array;
this(int[] array) { this.array = array; }
int[] opIndex() { return array; }
// etc.
}
void main()
{
import std.algorithm;
auto c = new C([1, 2, 3]);
c[].filter!"true".each!writeln;
assert(c[].length == 3);
}
```
More information about the Digitalmars-d-learn
mailing list