Question about: ("1.1").to!int;
Виталий Фадеев
vital.fadeev at gmail.com
Sat Oct 24 03:55:55 UTC 2020
On Friday, 23 October 2020 at 16:59:06 UTC, matheus wrote:
> On Friday, 23 October 2020 at 13:57:41 UTC, Joseph Rushton
> Wakeling wrote:
>> On Wednesday, 21 October 2020 at 22:50:27 UTC, matheus wrote:
>>> Since (1.1).to!int = 1, shouldn't the string value
>>> ("1.1").to!int at least try to convert to float/double and
>>> then to int?
>>
>> The thing is, that's a great way for hard-to-identify bugs to
>> creep into code. In these cases:
>>
>> auto a = (1).to!int; // this works
>> auto b = ("1").to!int; // this works
>> auto c = (1.1).to!int; // this works and c = 1
>>
>> ... then what the programmer wants is unambiguous. In the
>> first case it's just converting int => int. In the second,
>> it's converting from a string that unambiguously represents an
>> integer value, to an int. And in the third, it's converting
>> _at programmer request_ from a double to an int (which has a
>> well-defined behaviour).
>>
>> However, if ("1.1").to!int were to work, this would be the
>> `to` function making a judgement call on how to handle
>> something ambiguous. And while that judgement call may be
>> acceptable for your current use-case, it won't be for others.
>
> I got it everything you said, but like a said previously:
>
> (1.1).to!int vs ("1.1").to!int
>
> One is a decimal literal while the other is a string
> representation of a decimal.
>
> To be honest I think the function is already making a judgment
> call when I do (1.1).to!int and returns 1, I really fail to see
> the difference when is ("1.1").to!int.
>
> I agree with user1234: "The third case is just like `cast(int)
> 1.1` it's not _at programmer request_ from my point of view,
> it's just that the `to` template has not be more restrictive
> than the D `cast` expression. `to` should do at least what a
> `cast` do and do more when there's no rule for the two types
> that are involved."
>
>> In particular, if `to` just accepted any string numerical
>> representation for conversion to int, how could the caller
>> explicitly _exclude_ non-integer input, if that is their
>> use-case?
>
> Well since the caller is handling a string, shouldn't the
> caller verify the content before any conversion?
>
> Because a string may contain a integer, decimal representation
> or neither one.
>
> Finally I don't want to make a fuss of it, I just thought it
> was a bit weird but it can be solved easily.
>
> Thanks,
>
> Matheus.
For _execution speed_ reason we need low-level functions.
What if on each call ("1").to!int we will do parsing "1" for
decimal point "." ?
.
Should be Low-level functions and High-level functions.
"to" is Low-level function.
.
You can create "To" function with parsing & validating.
You right: if "to" generating exception for non-numeric symbol,
then it doing test each char... and "to" can just break loop at
non-numeric symbol.
.
And...
.
"1".to!int
"1.1".to!int
"1abc".to!int
...they all can be == 1
.
Some like this:
foreach( c; str )
if ( c.between( '0', '9' ) )
result *= factor; result += ( c-'0' );
else
break;
.
You can write patch.
More information about the Digitalmars-d-learn
mailing list