Please improve the with statement by allowing initialisation
Dejan Lekic
dejan.lekic at gmail.com
Wed Mar 12 18:55:45 UTC 2025
This is what we currently _have_ to do in D:
```d
auto app = new Application();
auto win = new Window();
with (win) {
setTitle("Example");
setDefaultSize(200, 200);
setChild(mainBox);
}
app.addWindow(win);
```
In most cases you really do not want the `auto win = new Window;`
line because you should be able to do it all inside the with
block. Since with statement does not allow initialisation one
would try:
```d
auto app = new Application();
with (new Window) {
setTitle("Example");
setDefaultSize(200, 200);
setChild(mainBox);
app.addWindow(???); // we CAN'T refer to the object created by
the `new Window`
}
```
What I do is I make classes that I want to use the with statement
on have a property called `self` that simply return this. This
allows me to write something like:
```d
auto app = new Application();
with (new MyWindow) {
setTitle("Example");
setDefaultSize(200, 200);
setChild(mainBox);
app.addWindow(self); // MyWindow implements self
}
```
I would still prefer an initialisation because it matches what we
have in the `for` statement, but I would not mind if D allows
something like `this` in the with block, yet I would not call it
`this`. `self` maybe. `that`? I do not know. This is precisely
why I prefer the initialisation instead - because I do not know
what would be the best name for this reference...
Please do not even start with the fluent APIs in this thread.
Why? Because what I am asking above does not require people to
refactor their libraries to make them "fluent", it will work out
of box with anything.
For those who wonder what am I talking about - let's assume this
particular library I am using has a fluent API. Then I could
write the code above like this:
```d
auto win = new Window;
win.setTitle("Example")
.setDefaultSize(200.200)
.setChild(mainBox);
app.addWindow(win);
```
This would work because all Window methods return this. We do not
always have luxury of being able to change the library we use,
especially make such a drastic change so that all methods return
this (which would be required for the fluent API to work).
More information about the Digitalmars-d
mailing list