Difference between revisions of "Voldemort types"
(→Subverting unnameability) |
(factual corrections) |
||
Line 7: | Line 7: | ||
<syntaxhighlight lang=D> | <syntaxhighlight lang=D> | ||
// Note: the return type is auto, because we cannot actually name it outside the function! | // Note: the return type is auto, because we cannot actually name it outside the function! | ||
− | auto createVoldemortType() | + | auto createVoldemortType(int value) |
{ | { | ||
+ | int x = value; | ||
struct TheUnnameable | struct TheUnnameable | ||
{ | { | ||
− | + | void getValue() { return x; } | |
} | } | ||
− | return TheUnnameable( | + | return TheUnnameable(); |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 20: | Line 21: | ||
<syntaxhighlight lang=D> | <syntaxhighlight lang=D> | ||
− | auto voldemort = createVoldemortType(); | + | auto voldemort = createVoldemortType(123); |
− | writeln(voldemort. | + | writeln(voldemort.getValue()); // prints 123 |
</syntaxhighlight> | </syntaxhighlight> | ||
− | The type of the variable voldemort cannot be explicitly named here, because that name is only accessible inside the function createVoldemortType. However, we can still declare variables of that type by using D's static type inference. | + | The type of the variable voldemort cannot be explicitly named here, because that name is only accessible inside the function createVoldemortType. Furthermore, it cannot be created outside of this function, because its definition relies on a local variable in the function. However, we can still declare variables of that type by using D's static type inference, to store the function's return value. |
==Purpose== | ==Purpose== | ||
Line 35: | Line 36: | ||
This also allows the Phobos developers to change the underlying implementation without requiring all users to update their code. Otherwise, every time the implementation changes you will have to update every instance of the type to refer to the correct type name. Using Voldemort types alleviates this problem by letting the compiler fill in the correct type for you automatically. | This also allows the Phobos developers to change the underlying implementation without requiring all users to update their code. Otherwise, every time the implementation changes you will have to update every instance of the type to refer to the correct type name. Using Voldemort types alleviates this problem by letting the compiler fill in the correct type for you automatically. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==See also== | ==See also== |
Revision as of 17:43, 15 December 2012
In D, a Voldemort type is a type that cannot be directly named outside of the scope it's declared in, but code outside the scope can still use this type by taking advantage of D's static type inference.
Usage
For example:
// Note: the return type is auto, because we cannot actually name it outside the function!
auto createVoldemortType(int value)
{
int x = value;
struct TheUnnameable
{
void getValue() { return x; }
}
return TheUnnameable();
}
Here is how the Voldemort type can be used:
auto voldemort = createVoldemortType(123);
writeln(voldemort.getValue()); // prints 123
The type of the variable voldemort cannot be explicitly named here, because that name is only accessible inside the function createVoldemortType. Furthermore, it cannot be created outside of this function, because its definition relies on a local variable in the function. However, we can still declare variables of that type by using D's static type inference, to store the function's return value.
Purpose
Voldemort types are widely used in Phobos's range-based functions. They are used as internal types that implement that particular range function. Voldemort types were chosen for this in order to improve encapsulation: users of the standard library don't need to, and shouldn't need to, know how a particular range function was implemented.
In fact, some of the range-based functions will return different types based on what kind of range was passed in. Rather than forcing the user to remember which type to use for which occasion, the use of Voldemort types forces the user to depend on static type inference, and thus automatically get the right type every time.
This also allows the Phobos developers to change the underlying implementation without requiring all users to update their code. Otherwise, every time the implementation changes you will have to update every instance of the type to refer to the correct type name. Using Voldemort types alleviates this problem by letting the compiler fill in the correct type for you automatically.