digitalmars.D.learn - Parsing a string from stdin using formattedRead
- Mark (13/13) Dec 06 2017 std.format has the function formattedRead which can be used to
- =?UTF-8?Q?Ali_=c3=87ehreli?= (8/14) Dec 06 2017 formattedRead takes the first parameter as 'ref'.
- Mark (4/21) Dec 06 2017 I see. That's somewhat inconvenient.
- Adam D. Ruppe (14/15) Dec 07 2017 You could write a little wrapper function to do that
std.format has the function formattedRead which can be used to parse a string, e.g. string first_name; string last_name; string info = readln(); formattedRead(info, "%s %s", first_name, last_name); This piece of code works as intended. However, since I don't need the input after it's parsed, I wanted to omit the 3rd line of code above and replace the 4th line with formattedRead(readln(), "%s %s", first_name, last_name); But this raises a compilation error, claiming that formattedRead "cannot deduce function from argument types". What's the problem here?
Dec 06 2017
On 12/06/2017 10:47 AM, Mark wrote:string info = readln(); formattedRead(info, "%s %s", first_name, last_name); This piece of code worksformattedRead(readln(), "%s %s", first_name, last_name); But this raises a compilation error, claiming that formattedRead "cannot deduce function from argument types".formattedRead takes the first parameter as 'ref'. I hope we can change compiler error messages like this. What it means is that although the 'string' part of the argument matched, it cannot be passed as 'ref' because what readln() returns is an rvalue. (On the other hand, info above is an lvalue.) rvalues cannot be bound to references in D. Ali
Dec 06 2017
On Wednesday, 6 December 2017 at 18:57:55 UTC, Ali Çehreli wrote:On 12/06/2017 10:47 AM, Mark wrote:I see. That's somewhat inconvenient. I recall there was some debate(s) about allowing rvalues as const references (like in C++). What was the verdict on that?string info = readln(); formattedRead(info, "%s %s", first_name, last_name); This piece of code worksformattedRead(readln(), "%s %s", first_name, last_name); But this raises a compilation error, claiming thatformattedRead "cannotdeduce function from argument types".formattedRead takes the first parameter as 'ref'. I hope we can change compiler error messages like this. What it means is that although the 'string' part of the argument matched, it cannot be passed as 'ref' because what readln() returns is an rvalue. (On the other hand, info above is an lvalue.) rvalues cannot be bound to references in D. Ali
Dec 06 2017
On Wednesday, 6 December 2017 at 18:47:03 UTC, Mark wrote:formattedRead(readln(), "%s %s", first_name, last_name);You could write a little wrapper function to do that uint myformattedRead (R, Char, S...)(R r, const(Char)[] fmt, auto ref S args) { formattedRead(r, fmt, args); } It just strips the ref off of the input string but otherwise forwards the same thing. The reason it is ref tho btw is that that allows it to continue off a particular input; you can do like string s; formattedRead(s, ....) formattedRead(s, ....) // this one picks up where the last one left off
Dec 07 2017