mixin template's alias parameter ... ignored ?
jfondren
julian.fondren at gmail.com
Mon Jul 12 23:18:57 UTC 2021
On Monday, 12 July 2021 at 22:35:27 UTC, someone wrote:
>> Bug: `scope` makes no sense if you want to return
>> `lstrSequence` (throughout).
>
> Teach me please: if I declare a variable right after the
> function declaration like this one ... ain't scope its default
> visibility ? I understand (not quite sure whether correct or
> not right now) that everything you declare without explicitly
> stating its visibility (public/private/whatever) becomes scope
> ie: what in many languages are called a local variable. What
> actually is the visibility of lstrSequence without my scope
> declaration ?
Local variables don't have a visibility in the sense of public or
private. They do have a 'scope' in the general computer science
sense, and a variable can be said to be in or out of scope at
different points in a program, but this is the case without
regard for whether the variable is declared with D's `scope`.
What `scope` says is https://dlang.org/spec/attribute.html#scope
>For local declarations, scope ... means that the destructor for
>an object is automatically called when the reference to it goes
>out of scope.
The value of a normal, non-scope local variable has a somewhat
indefinite lifetime: you have to examine the program and think
about operations on the variable to be sure about that lifetime.
Does it survive the function? Might it die even before the
function completes? Does it live until the next GC collection or
until the program ends? These are questions you can ask.
For a `scope` variable, the lifetime of its value ends with the
scope of the variable.
Consider:
```d
import std.stdio : writeln, writefln;
import std.conv : to;
import core.memory : pureMalloc, pureFree;
class Noisy {
static int ids;
int* id;
this() {
id = cast(int*) pureMalloc(int.sizeof);
*id = ids++;
}
~this() {
writefln!"[%d] I perish."(*id);
pureFree(id);
}
}
Noisy f() {
scope n = new Noisy;
return n;
}
void main() {
scope a = f();
writeln("Checking a.n...");
writefln!"a.n = %d"(*a.id);
}
```
Which has this output on my system:
```d
[0] I perish.
Checking a.n...
Error: program killed by signal 11
```
Or with -preview=dip1000, this dmd output:
```d
Error: scope variable `n` may not be returned
```
the lifetime of the Noisy object bound by `scope n` is the same
as the scope of the variable, and the varaible goes out of scope
when the function returns, so the Noisy object is destructed at
that point.
More information about the Digitalmars-d-learn
mailing list