digitalmars.D.learn - std.array : appender woes
- abad (16/16) Jun 16 2016 import std.array : appender;
- cym13 (2/18) Jun 16 2016 I don't find it confusing at all, what did you expect?
- abad (6/27) Jun 16 2016 Consider the word clear in this context. What is it that gets
- Steven Schveighoffer (4/31) Jun 16 2016 In fact, what gets cleared is the data in the array. You have a dangling...
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?
Jun 16 2016
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?
Jun 16 2016
On Thursday, 16 June 2016 at 07:59:50 UTC, cym13 wrote:On Thursday, 16 June 2016 at 07:47:03 UTC, abad wrote: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.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?
Jun 16 2016
On 6/16/16 6:08 AM, abad wrote:On Thursday, 16 June 2016 at 07:59:50 UTC, cym13 wrote: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. -SteveOn Thursday, 16 June 2016 at 07:47:03 UTC, abad wrote: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.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?
Jun 16 2016