Getting nice print of struct for debugging

Minty Fresh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Feb 24 17:27:09 PST 2017


On Wednesday, 22 February 2017 at 11:18:15 UTC, Martin 
Tschierschke wrote:
> On Tuesday, 21 February 2017 at 14:02:54 UTC, Jacob Carlborg 
> wrote:
> [...]
>> Yes, this works, I would say this is the simplest:
>>
>> MyStruct s;
>>
>> foreach (index, name ; FieldNameTuple!MyStruct)
>>     writefln("%s: %s", name, s.tupleof[index]);
>>
>> If you want something more close to "send" in Ruby, you need 
>> to use a string mixin, like this:
>>
>> foreach (name ; FieldNameTuple!MyStruct)
>>     writefln("%s: %s", name, mixin("s." ~ name));
>>
>> The string mixin example works for methods, opDispatch and 
>> similar as well. The tupleof example, the first one, works 
>> only for fields.
> Exactly what I was looking for, **thank you!**
> Both ways of accessing the struct elements are very interesting,
> giving an impression what is possible with D.
>
>
> Is it possible to overwrite "toString" for all structs in one 
> step?
>
> Regards mt.

Since structs are Plain-old Data and don't do inheritance, the 
best option is a template mixin.

ie.

   template mixin PrettyPrint
   {
       string toString()
       {
           // . . .
       }
   }

 From there, you can mix it into any struct you want.

   struct MyStruct
   {
       mixin PrettyPrint;
   }

If you're familiar with Rails, this is similar to a Concern.


More information about the Digitalmars-d-learn mailing list