On Thu, Oct 29, 2020 at 04:56:46PM +0000, IGotD- via Digitalmars-d-learn wrote:
> On Thursday, 29 October 2020 at 16:45:51 UTC, Ali Çehreli wrote:
> > 
> > import std;
> > 
> > immutable string p;
> > 
> > shared static this() {
> >   p = environment["PATH"];  // <-- Run time
> > }
> > 
> 
> Just to clarify, immutable is allowed to be initialized in ctors but
> not anything later than that? Moving p = environment["PATH"] to main
> would generate an error.

1) Module-level immutable can be initialized either as part of the
declaration:

        immutable int x = 1;

2) Or from inside a shared static this():

        immutable int x;
        shared static this() {
                x = 2;
        }

Note that initialization from ctor must be done from `shared static
this()`, which is global; initialization from `static this` is currently
accepted but deprecated, because that's a TLS ctor, and immutables are
implicitly shared so you could potentially break immutability by having
the TLS ctor set it to a different value per thread.  Eventually this
will become a hard error.

The following are errors:

3)
        immutable int x = 1;
        shared static this() {
                x = 2; // NG: cannot modify immutable
        }

4)
        immutable int x;
        void main() {
                x = 3; // NG: cannot modify immutable
        }


T

-- 
Lottery: tax on the stupid. -- Slashdotter

Reply via email to