Thread overview | ||||||
---|---|---|---|---|---|---|
|
June 16, 2016 std.array : appender woes | ||||
---|---|---|---|---|
| ||||
import std.array : appender; import std.stdio : writeln; void main() { auto app = appender!(char[]); app.put('x'); auto foo = app.data; app.clear; // done, start a new array app.put('y'); writeln(foo); } This prints out 'y'. It's not surprising because what I suppose app.data is doing is just returning a slice of the dynamic array. Clear() resets the counter of current position. But this behavior is confusing in practical use, IMHO. Should calling clear in your opinion guarantee that a new array gets allocated? |
June 16, 2016 Re: std.array : appender woes | ||||
---|---|---|---|---|
| ||||
Posted in reply to abad | On Thursday, 16 June 2016 at 07:47:03 UTC, abad wrote:
> import std.array : appender;
> import std.stdio : writeln;
>
> void main() {
> auto app = appender!(char[]);
> app.put('x');
> auto foo = app.data;
> app.clear; // done, start a new array
> app.put('y');
> writeln(foo);
> }
>
> This prints out 'y'. It's not surprising because what I suppose app.data is doing is just returning a slice of the dynamic array. Clear() resets the counter of current position. But this behavior is confusing in practical use, IMHO.
>
> Should calling clear in your opinion guarantee that a new array gets allocated?
I don't find it confusing at all, what did you expect?
|
June 16, 2016 Re: std.array : appender woes | ||||
---|---|---|---|---|
| ||||
Posted in reply to cym13 | On Thursday, 16 June 2016 at 07:59:50 UTC, cym13 wrote:
> On Thursday, 16 June 2016 at 07:47:03 UTC, abad wrote:
>> import std.array : appender;
>> import std.stdio : writeln;
>>
>> void main() {
>> auto app = appender!(char[]);
>> app.put('x');
>> auto foo = app.data;
>> app.clear; // done, start a new array
>> app.put('y');
>> writeln(foo);
>> }
>>
>> This prints out 'y'. It's not surprising because what I suppose app.data is doing is just returning a slice of the dynamic array. Clear() resets the counter of current position. But this behavior is confusing in practical use, IMHO.
>>
>> Should calling clear in your opinion guarantee that a new array gets allocated?
>
> I don't find it confusing at all, what did you expect?
Consider the word clear in this context. What is it that gets cleared? The data in the array (which might imply reallocation)? Nope, what gets "cleared" is the index to current position in the array. I think 'reset' may have been a better name for the function.
|
June 16, 2016 Re: std.array : appender woes | ||||
---|---|---|---|---|
| ||||
Posted in reply to abad | On 6/16/16 6:08 AM, abad wrote:
> On Thursday, 16 June 2016 at 07:59:50 UTC, cym13 wrote:
>> On Thursday, 16 June 2016 at 07:47:03 UTC, abad wrote:
>>> import std.array : appender;
>>> import std.stdio : writeln;
>>>
>>> void main() {
>>> auto app = appender!(char[]);
>>> app.put('x');
>>> auto foo = app.data;
>>> app.clear; // done, start a new array
>>> app.put('y');
>>> writeln(foo);
>>> }
>>>
>>> This prints out 'y'. It's not surprising because what I suppose
>>> app.data is doing is just returning a slice of the dynamic array.
>>> Clear() resets the counter of current position. But this behavior is
>>> confusing in practical use, IMHO.
>>>
>>> Should calling clear in your opinion guarantee that a new array gets
>>> allocated?
>>
>> I don't find it confusing at all, what did you expect?
>
> Consider the word clear in this context. What is it that gets cleared?
> The data in the array (which might imply reallocation)? Nope, what gets
> "cleared" is the index to current position in the array. I think 'reset'
> may have been a better name for the function.
In fact, what gets cleared is the data in the array. You have a dangling reference to the array, for which the data is not technically valid.
-Steve
|
Copyright © 1999-2021 by the D Language Foundation