www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - No property 'clear/shrinkTo' for type 'Appender!(string)'

reply Eric Desbiens <olace.mail gmail.com> writes:
Hello,

If I create an appender for a string, I cannot call the funtion clear or
shrinkTo. For example:

    auto strAppender = appender!string();
    strAppender.clear();
    strAppender.shrinkTo();

gives compilation error. In std.array source code, it seems that it allows
those function to work only on types that are not immutable. But on a normal
string, I can change the length with no problem or reinitialize it.

I am pretty new to D and I just want to be sure that this is a bug before
reporting it in bugzilla or if this is by design.

Thanks
Nov 11 2010
parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Thu, 11 Nov 2010 15:33:41 -0500, Eric Desbiens <olace.mail gmail.com>  
wrote:

 Hello,

 If I create an appender for a string, I cannot call the funtion clear or
 shrinkTo. For example:

     auto strAppender = appender!string();
     strAppender.clear();
     strAppender.shrinkTo();

 gives compilation error. In std.array source code, it seems that it  
 allows
 those function to work only on types that are not immutable. But on a  
 normal
 string, I can change the length with no problem or reinitialize it.

 I am pretty new to D and I just want to be sure that this is a bug before
 reporting it in bugzilla or if this is by design.

It's not a bug, it's to prevent immutable data from being mutated. When you shrink the length of a builtin string, it does work, but any appending from that point will create a copy of that string to append to. Appender is built for appending and so is more focused on appending in-place. Therefore, clear and shrinkTo allow you to overwrite the data that had already been valid. This is no good with immutable data. As a solution, you can simply create a new appender: strAppender = strAppender.init; However, that seems limited, now that I look at it. It may be better to allow clear at least to simply reset the appended-to array to null, and allow you to start appending again. Go ahead and file a bug, and mark it as an enhancement. -Steve
Nov 11 2010