November 08, 2014 Re: toString refactor in druntime | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Monday, 3 November 2014 at 16:02:23 UTC, Steven Schveighoffer wrote:
> On 10/31/14 3:07 PM, H. S. Teoh via Digitalmars-d wrote:
>> On Fri, Oct 31, 2014 at 12:04:24PM -0700, Walter Bright via Digitalmars-d wrote:
>>> On 10/27/2014 12:42 AM, Benjamin Thaut wrote:
>>>> I'm planning on doing a pull request for druntime which rewrites
>>>> every toString function within druntime to use the new sink
>>>> signature. That way druntime would cause a lot less allocations which
>>>> end up beeing garbage right away. Are there any objections against
>>>> doing so? Any reasons why such a pull request would not get accepted?
>>>
>>> Why a sink version instead of an Output Range?
>>
>> To allow toString to be a virtual function, perhaps?
>>
>> Besides, the sink version basically allows encapsulation of an output
>> range -- instead of calling x.toString(outputRange) you just write:
>>
>> x.toString((const(char)[] data) { outputRange.put(data); });
>
> No, please don't do that. It's put(outputRange, data);
>
> -Steve
Why?
|
November 08, 2014 Re: toString refactor in druntime | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On 11/8/14 5:25 AM, John Colvin wrote:
> On Monday, 3 November 2014 at 16:02:23 UTC, Steven Schveighoffer wrote:
>> On 10/31/14 3:07 PM, H. S. Teoh via Digitalmars-d wrote:
>>> x.toString((const(char)[] data) { outputRange.put(data); });
>>
>> No, please don't do that. It's put(outputRange, data);
>>
>
> Why?
import std.range;
struct ORange
{
void put(char) {}
}
static assert(isOutputRange!(ORange, char));
void main()
{
char[] buf = "hello".dup;
ORange r;
//r.put(buf); // fails
put(r, buf); // works
}
I have said before, making the UFCS function the same name as the member hook it uses was a bad anti-pattern. Now, you must always use the non-UFCS version of put, which sucks.
-Steve
|
Copyright © 1999-2021 by the D Language Foundation