Format

cc cc at nevernet.com
Sat May 22 03:07:10 UTC 2021


On Friday, 21 May 2021 at 16:53:48 UTC, drug wrote:
> 21.05.2021 18:28, cc пишет:
>> On Friday, 21 May 2021 at 14:19:03 UTC, newbie wrote:
>>> Thank you, and formatValue?
>> 
>> formattedWrite should handle this.
>> 
>> ```d
>> @safe struct Foo {
>>      int x = 3;
>>      void toString(W)(ref W writer) if (isOutputRange!(W, 
>> char)) {
>>          writer.formattedWrite("Foo(%s)", x);
>>      }
>> }
>> Foo foo;
>> writeln(foo);
>> ```
>> 
>> Oddly enough this form of toString works from @safe code even 
>> if it's not marked @safe, or even marked @system...
>
> I guess that because it is a template so the compiler is able 
> to deduce its attributes. What about the case when it is marked 
> @system - in this case compiler ignore that method due to the 
> fact that it is @system and generate the default one. Because 
> your implementation of the method is equal to the default 
> implementation you didn't see the difference but it exists. Try 
> to make your implementation of `toString` different and you'll 
> see.

Ahh, in that case it would appear formattedWrite isn't @safe at 
all.  Looks like you have to stick with put()?
```d
@safe void toString(W)(ref W writer) if (isOutputRange!(W, char)) 
{
	//writer.formattedWrite!("FOO:%s", x); // fails
	import std.conv;
	put(writer, "FOO:");
	put(writer, x.to!string);
}
```


More information about the Digitalmars-d-learn mailing list