What is a sink delegate?

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Oct 10 06:30:25 PDT 2014


On 10/10/14 1:00 AM, Ali Çehreli wrote:
> On 10/09/2014 08:06 PM, Joel wrote:
>> On Tuesday, 30 September 2014 at 17:27:09 UTC, Adam D. Ruppe wrote:
>>> On Tuesday, 30 September 2014 at 17:22:44 UTC, Gary Willoughby wrote:
>>>> What is a sink delegate?
>>>
>>> Instead of
>>>
>>> string toString() { return "foo"; }
>>>
>>> for example, you would use:
>>>
>>> void toString(void delegate(string) sink) { sink("foo"); }
>>>
>>> The sink argument there is then free to view and discard the data or
>>> to make a private copy using whatever scheme it desires.
>>
>>
>> How do you use that toString? Maybe an example? Below is my failed
>> effort.
>>
>> import std.stdio;
>>
>> struct Try {
>>      string name;
>>      long age;
>>
>>      void toString(void delegate(string) sink) {
>>          sink("foo");
>>      }
>> }
>>
>> void main() {
>>      Try t = Try("Joel", 35);
>>      writeln(t);
>> }
>
> The signature of that toString is different from what I have been seeing
> and using. The following works:
>
>      void toString(void delegate(const(char)[]) sink) const {

The delegate parameter is what is important. The function that is going 
to be passed in takes a const(char)[], which actually should, but does 
not, implicitly cast to a delegate(string) (see issue 
https://issues.dlang.org/show_bug.cgi?id=3075).

The const outside is irrelevant to whether it will accept it or not, 
that is a contract between the toString function and your object. If you 
want a non-const toString, I think that should work.

(actually, testing it...) Yep, it works without the const on the outside.

-Steve


More information about the Digitalmars-d-learn mailing list