www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - writeln the struct from the alis this Example from the home page

reply Martin Tschierschke <mt smartdolphin.de> writes:
Hello, if you take the example from the home page, with the 
additional last line:

```d
struct Point
{
     private double[2] p;
     // Forward all undefined symbols to p
     alias p this;
     double dot(Point rhs)
     {
         return p[0] * rhs.p[0] + p[1] * rhs.p[1];
     }
}
void main()
{
     import std.stdio : writeln;
     // Point behaves like a `double[2]` ...
     Point p1, p2; p1 = [2, 1], p2 = [1, 1];
     assert(p1[$ - 1] == 1);
     // ... but with extended functionality
     writeln("p1 dot p2 = ", p1.dot(p2));
     // additional line:
     writeln(p1); // is not possible !
}
```
/usr/include/dmd/phobos/std/format.d(3193): Error: no [] operator 
overload for type Point
..
...

How to define, that for Point the same formatting should be used 
as for double[2] ?
Nov 18 2021
parent reply Paul Backus <snarwin gmail.com> writes:
On Thursday, 18 November 2021 at 13:51:42 UTC, Martin 
Tschierschke wrote:
 Hello, if you take the example from the home page, with the 
 additional last line:

 ```d
 struct Point
 {
     private double[2] p;
     // Forward all undefined symbols to p
     alias p this;
     double dot(Point rhs)
     {
         return p[0] * rhs.p[0] + p[1] * rhs.p[1];
     }
 }
 void main()
 {
     import std.stdio : writeln;
     // Point behaves like a `double[2]` ...
     Point p1, p2; p1 = [2, 1], p2 = [1, 1];
     assert(p1[$ - 1] == 1);
     // ... but with extended functionality
     writeln("p1 dot p2 = ", p1.dot(p2));
     // additional line:
     writeln(p1); // is not possible !
 }
 ```
 /usr/include/dmd/phobos/std/format.d(3193): Error: no [] 
 operator overload for type Point
 ..
 ...

 How to define, that for Point the same formatting should be 
 used as for double[2] ?
You can define a `toString` method, like this: ```d string toString() { import std.conv; return p.to!string; } ``` You can find more information about `toString` in the documentation here: https://dlang.org/phobos/std_format_write.html By the way, the reason your original version does not work is that `p` is `private`, so `writeln` cannot access it. If you change `p` to be `public`, it will work without a `toString` method.
Nov 18 2021
next sibling parent reply Jordan Wilson <wilsonjord gmail.com> writes:
On Thursday, 18 November 2021 at 16:08:22 UTC, Paul Backus wrote:
 On Thursday, 18 November 2021 at 13:51:42 UTC, Martin 
 Tschierschke wrote:
 [...]
You can define a `toString` method, like this: ```d string toString() { import std.conv; return p.to!string; } ``` You can find more information about `toString` in the documentation here: https://dlang.org/phobos/std_format_write.html By the way, the reason your original version does not work is that `p` is `private`, so `writeln` cannot access it. If you change `p` to be `public`, it will work without a `toString` method.
I thought private was to the module/file, not class/struct? Jordan
Nov 18 2021
parent Steven Schveighoffer <schveiguy gmail.com> writes:
On 11/18/21 2:58 PM, Jordan Wilson wrote:
 On Thursday, 18 November 2021 at 16:08:22 UTC, Paul Backus wrote:
 On Thursday, 18 November 2021 at 13:51:42 UTC, Martin Tschierschke wrote:
 [...]
You can define a `toString` method, like this: ```d string toString() {     import std.conv;     return p.to!string; } ``` You can find more information about `toString` in the documentation here: https://dlang.org/phobos/std_format_write.html By the way, the reason your original version does not work is that `p` is `private`, so `writeln` cannot access it. If you change `p` to be `public`, it will work without a `toString` method.
I thought private was to the module/file, not class/struct?
`writeln` is not in your module. -Steve
Nov 18 2021
prev sibling parent Martin Tschierschke <mt smartdolphin.de> writes:
On Thursday, 18 November 2021 at 16:08:22 UTC, Paul Backus wrote:
 On Thursday, 18 November 2021 at 13:51:42 UTC, Martin 
 Tschierschke wrote:
 [...]
You can define a `toString` method, like this: ```d string toString() { import std.conv; return p.to!string; } ``` You can find more information about `toString` in the documentation here: https://dlang.org/phobos/std_format_write.html By the way, the reason your original version does not work is that `p` is `private`, so `writeln` cannot access it. If you change `p` to be `public`, it will work without a `toString` method.
Thank you, just removing ``private `` and it worked!
Nov 19 2021