On Thursday, 21 November 2013 at 07:36:38 UTC, Jacob Carlborg
wrote:
On 2013-11-20 19:53, Meta wrote:
Yes. It is very important not to allow direct access to the
underlying
value. This is important for ensuring that it is not put in an
invalid
state. This is a mistake that was made with
std.typecons.Nullable,
making it useless for anything other than giving a
non-nullable type a
null state (which, in fairness, is probably all that it was
originally
intended for).
In that case all string functionality needs to be provided
inside the Validated struct. In addition to that we loose the
beauty of UFCS, at least for functions expecting plain "string".
This is tricky business. Unfortunately, having the wrapper be
able to degrade to its base type is at odds with providing
compiler-enforced guarantees. We can't allow direct access to the
underlying string, because the user could purposely or
inadvertently put it in an invalid state. On the other hand,
these opaque wrapper types can no longer be transparently
substituted into existing code. One solution is copying the
validated string to do arbitrary operations on, leaving the
original validated string unchanged.
auto validatedString = validate!isValidUTF(someString);
//Doesn't work; Validated!string does not expose the string
interface
//auto invalidString = validatedString.map!(c => c -
cast(char)int.max);
//Also doesn't work
//validatedString ~= cast(char)0xFFFF
auto validatedCopy = validatedString.duplicate();
//Do bad things with validatedCopy. validatedString remains
unchanged and valid