Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
October 30, 2013 parse int error | ||||
---|---|---|---|---|
| ||||
I am confused as to why I cannot pass the return of the tag attribute directly into the parse int. // This works string s = xml.tag.attr["key"]; int key = parse!int(s); // Compile error on these int key = parse!int(xml.tag.attr["key"]); int key = parse!int(cast(string) cml.tag.attr["key"]); |
October 30, 2013 Re: parse int error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Eisenhower | On Wednesday, 30 October 2013 at 01:02:45 UTC, Peter Eisenhower wrote: > I am confused as to why I cannot pass the return of the tag attribute directly into the parse int. > > // This works > string s = xml.tag.attr["key"]; > int key = parse!int(s); > > // Compile error on these > int key = parse!int(xml.tag.attr["key"]); > int key = parse!int(cast(string) cml.tag.attr["key"]); This is the compile error Error: template instance std.conv.parse!(int,const(immutable(char)[])) error instantiating |
October 30, 2013 Re: parse int error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Eisenhower | On Wednesday, October 30, 2013 02:02:40 Peter Eisenhower wrote:
> I am confused as to why I cannot pass the return of the tag attribute directly into the parse int.
>
> // This works
> string s = xml.tag.attr["key"];
> int key = parse!int(s);
>
> // Compile error on these
> int key = parse!int(xml.tag.attr["key"]);
> int key = parse!int(cast(string) cml.tag.attr["key"]);
parse takes the string by ref and removes what it's parsing from the string, so it can't be a temporary. It has to be an lvalue. Also, casting results in an rvalue. To use parse, you should generally be using a local variable for the string.
- Jonathan M Davis
|
October 30, 2013 Re: parse int error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Eisenhower | On 10/29/2013 06:02 PM, Peter Eisenhower wrote:
> I am confused as to why I cannot pass the return of the tag attribute
> directly into the parse int.
>
> // This works
> string s = xml.tag.attr["key"];
> int key = parse!int(s);
>
> // Compile error on these
> int key = parse!int(xml.tag.attr["key"]);
> int key = parse!int(cast(string) cml.tag.attr["key"]);
A trivial wrapper makes it convenient:
import std.xml;
import std.conv;
T getAttr(T)(DocumentParser xml, string attrName)
{
string s = xml.tag.attr[attrName];
T attr = parse!T(s);
return attr;
}
unittest
{
auto xml = new DocumentParser(`<test key="1"></test>`);
auto key = xml.getAttr!int("key");
assert(key == 1);
}
void main()
{}
Ali
|
November 03, 2013 Re: parse int error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Wednesday, 30 October 2013 at 18:19:13 UTC, Ali Çehreli wrote:
> On 10/29/2013 06:02 PM, Peter Eisenhower wrote:
>> I am confused as to why I cannot pass the return of the tag attribute
>> directly into the parse int.
>>
>> // This works
>> string s = xml.tag.attr["key"];
>> int key = parse!int(s);
>>
>> // Compile error on these
>> int key = parse!int(xml.tag.attr["key"]);
>> int key = parse!int(cast(string) cml.tag.attr["key"]);
>
> A trivial wrapper makes it convenient:
>
> import std.xml;
> import std.conv;
>
> T getAttr(T)(DocumentParser xml, string attrName)
> {
> string s = xml.tag.attr[attrName];
> T attr = parse!T(s);
> return attr;
> }
>
> unittest
> {
> auto xml = new DocumentParser(`<test key="1"></test>`);
> auto key = xml.getAttr!int("key");
> assert(key == 1);
> }
>
> void main()
> {}
>
> Ali
Thanks
|
Copyright © 1999-2021 by the D Language Foundation