struct, ref in, and UFCS

Puming via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 30 22:34:05 PDT 2014


On Tuesday, 1 July 2014 at 05:26:47 UTC, Ali Çehreli wrote:
> On 06/30/2014 10:11 PM, Puming wrote:
>
> > On Tuesday, 1 July 2014 at 05:09:49 UTC, Puming wrote:
> >> Hi,
> >>
> >> I have a struct and want to extends its methods, like:
> >>
> >> ```d
> >> struct Server
> >> {
> >>   string name;
> >>   string ip;
> >>   int port;
> >>   string user;
> >> }
> >> ```
> >>
> >> extension method here:
> >>
> >> ```d
> >> string prompt(ref in Server server)
> >> {
> >>    return server.user ~ "@" ~ server.ip ~ ":" ~ server.port;
> >> }
> >>
> >> ```
> > should be `server.port.to!int`;
>
> I think it should actually be server.port.to!string;
>
> >> is this the correct way to use struct and UFCS? it does not
> seem to
> >> copy there.
>
> I don't understand your question but I wanted to help others by 
> making complete code from your messages:
>
> import std.conv;
>
> struct Server
> {
>     string name;
>     string ip;
>     int port;
>     string user;
> }
>
> string prompt(ref in Server server)
> {
>     return server.user ~ "@" ~ server.ip ~ ":" ~ 
> server.port.to!string;
> }
>
> void main()
> {
>     auto server = Server("bzzt", "192.168.0.1", 80, "nobody");
>     string p = server.prompt;
> }
>
> Ali

Thanks, This code works and my question is that is this a good 
practice to use `ref in` with structs instead of traditional 
pointer syntax (which does not play well with UFCS though) ? Is 
there any perfomance implications with `ref in`? I tried that it 
does not seem to copy the parameter value, which is good for me:


```d
#!/usr/bin/rdmd

import std.stdio;

struct Server
{
	string name;
}

string prompt(ref in Server server)
{
	__server.name = "new name";
	return server.name ~ ">";
}

Server __server;

void main()
{
	__server.name = "old_name";

	writeln(__server.prompt);
}
```

which prints

```
newname>
```

meaning the `return server.name ~ ">"` code in promt is using a 
reference of __server instead of copying the value.


More information about the Digitalmars-d-learn mailing list