Extending D's support for object-oriented design with private(this)
NotYouAgain
NotYouAgain at gmail.com
Fri May 24 06:32:30 UTC 2024
Jonathan M Davis wrote:
> On Tuesday, May 21, 2024 3:50:38 AM MDT Quirin Schroll via
dip.ideas
> wrote:
>> On Saturday, 27 April 2024 at 07:39:19 UTC, Jonathan M Davis
>>
>> wrote:
>> > (particularly since the change from private, public, etc. being
>> > protection attributes to visibility attributes seems to have
>> > been tricky enough that a number of subtle bugs were introduced
>> > in the process).
>>
>> I know this is slightly off-topic, but I have two questions about
>> that:
>> 1. When did this happen? I don’t need an exact date, but before
>> 2015 and after 2015 would be helpful to me because I started
>> learning D end of 2015 and so I could know if I ever used D with
>> the old “protection attributes” way.
>
> It was DIP 22:
>
> https://github.com/dlang/DIPs/blob/master/DIPs/archive/DIP22.md
>
> It looks like the original changes were merged in 2016.
>
>> 2. What is the difference? I don’t need details, maybe a single
>> example does the job.
>
> Before DIP 22, functions which the code did not have access to
(e.g. a
> private function in another module) were considered to be part of
the
> overload set but then resulted in an error when a function which
the
> calling code didn't have access to was the best match. This meant
that
> simply adding a private function to your module could break
someone else's
> code if it happened to be a better match for the arguments than
the
> overload that they'd been using. E.G. maybe they had a function
foo(long),
> and you added a private foo(int) to a module that they imported,
then any
> calls to foo with integer literals - like foo(42) - would suddenly
try to
> call your function instead of theirs, resulting in an error, since
it was
> private.
>
> After DIP 22, functions which the code does not have access to are
not
> considered part of the overload set. So, if you have multiple
functions
> with the same name which could match, a function which that code
does not
> have access to will no longer result in an error. Instead, you'll
get the
> best match out of the functions that you actually have access to.
So,
> adding a private foo(int) to your module won't suddenly result in
foo(42)
> trying to call your foo instead of the foo(long) that the code was
already
> using.
>
> So before, private, public, etc. were protection modifiers /
attributes,
> and now they're visibility modifiers / attributes, since before,
they
> controlled whether you had access to a symbol, whereas now, they
control
> whether that symbol is visible. You can still get at the private
stuff via
> traits, but otherwise (barring compiler bugs), the private symbols
don't
> exist for modules that import that module, and you won't get
breakage just
> because the list of private symbols in a module that you're
importing
> changes.
>
> - Jonathan M Davis
well, as long as mike-the-moderator keeps deleting news posts,
nobody will know the facts. they'll only know what mike-the-
moderator wants them to know.
More information about the dip.ideas
mailing list