On Friday, 2 August 2013 at 09:11:26 UTC, Jonathan M Davis wrote:
On Friday, August 02, 2013 10:35:22 monarch_dodra wrote:
On Friday, 2 August 2013 at 07:59:59 UTC, Jonathan M Davis wrote:
> On Friday, August 02, 2013 08:40:51 monarch_dodra wrote:
>> There was a request for enhancement to provide a >> "fromString"
>> for
>> arbitrary types. The idea is that once we have that, then
>> functions such as parse or to!S(string) will be generic, and
>> work
>> on mostly anything. Unfortunatly, (AFAIK), nobody is >> working on
>> this.
>> >> Here is a discussion I opened:
>> http://forum.dlang.org/thread/gzodptjyzpqnhxctb...@forum.dlang.org
>> >> ...and I just noticed it ends with me saying "I'll try to
>> write a
>> DIP then :)" and then not doing it :/
> > What's the point of fromString when a constructor will do the
> job just fine?
> > - Jonathan M Davis

Really? Because it's not generic. Unless I'm missing something,
I'm sure you can appreciate that the goal is to allow:

to!S("string")

As long as S defines a constructor which takes a string, this works just fine. All fromString would be doing would be to declare a function which did the
same thing as the constructor.

Right. That's what to! does. In that case, I'll correct myself, and say:

parse!S("string")

wouldn't work.

or
myFile.readf("Entry: %s", &s);

And a simple constructor doesn't (*CAN'T*) allow that.

Really? All it would have to do wolud be to pass the string that is the user
input into the constructor for typeof(s) and set s to that.

- Jonathan M Davis

It wouldn't because "myFile.readf("Entry: %s %s", &s, &s);" wouldn't know *what* to pass to the constructor. AFAIK. I could be wrong.

Regardless, a constructor can only be explicit, whereas a generic "fromString" can be implemented by default for structs, just the same way you don't ask users to write a toString.

Given:

struct Person
{
  string name;
}

Then:
parse!Person(`Person("Jonathan")`);
Should "just work".

Finally, a constructor is meant to construct an object, and not unserialize it. There could be notable differences in both.

auto myName = to!Person("Jonathan"); //Fine
parse!Person(`Person("Jonathan")`);

As you can see, the strings don't match. A constructor may not be the reciprocal of toString. You simply *can't* call a constructor in a parse operation.

Reply via email to