On Monday, 17 April 2017 at 11:14:47 UTC, Shachar Shemesh wrote:
On Sunday, 16 April 2017 at 17:00:25 UTC, Jack Stouffer wrote:
So we can say that D has buggy RAII. Claiming that D doesn't
have RAII is equally false.
To me, that's a basic misunderstanding of what RAII mean. RAII,
to me, means you wrap your resource in a container, and then
can just go ahead and forget about releasing it. As such,
saying that D has RAII, but they only work most of the time
means that the core functionality that RAII provides is simply
not working.
RAII !== containers. Containers will not release resources for
types that are themselves don't do so via their destructor. You
can have a vector<FILE*>, and it will dutifully release it's own
memory, but won't close the files.
Containers are library types. RAII is a language feature. How on
Earth in this discussion the two became interchanged?
There are other languages out there that have unreliable
destructors. Java has them. Python has them. No one will use
them.
D's destructors are in much better shape than either Java's or
Python's, but let's take a simple survey: Does anyone here use
RAII in D? Please step forward.
I do. Phobos does. vibe.d does. Many other projects do.
Please go over your scope(exit)s and tell me that 70% of them
(and I'm being generous here, I'm guessing actual number is
closer to 95%) are *not* release of resources acquired in the
same scope. If they are, then you are in a position where RAII
would have made your code cleaner and simpler, but you chose
not to use it.
Writing a whole new struct just to release one specific resource
once is neither cleaner nor simpler.
scope(exit) is a much cleaner solution than a finally clause,
but not as clean as RAII. If the language supports RAII, how
come people are not using it?
If it is more convenient to use scope(exit) than to introduce a
new type, I don't see why the latter should be considered. At
least until the need for the same scope(exit) is encountered more
than once. Not to mention there are also scope(success|failure)
that simply cannot be achieved with destructors.
D supports ("has") RAII idiom, period. Whether or how it is used
by various libraries does not in any way augment that fact.