Bartosz Milewski Wrote:

> The problem here is that the guy is sort of right. Indeed quote() expands the 
> slice before overwriting it and that requires re-allocation to avoid stomping 
> over the original buffer. There is however a boundary case, when the whole 
> buffer matches the pattern. Then the expansion is done in place and the 
> buffer is modified. This would never happen if expansion were guaranteed to 
> re-allocate. 

Actually, the requirement for not reallocating is that the slice ends at the 
end of an allocated block, so for example if the pattern matched at the end of 
the buffer, you may have problems.

The larger problem in the code is that the developer expects reallocation when 
it is not guaranteed.  That is, he is *depending* on reallocation.  In that 
case, you should explicitly reallocate.  This doesn't necessarily mean using 
.dup, the following works just fine:

return '"' ~ word ~ '"';

And it actually performs much better than the example.  In all honesty, I was 
sort of trying to play your game for this example.  In real life, I would have 
mentioned that the above line replaces the quote function, and most likely the 
coder would have accepted it not because it deterministically allocates but 
because it's cleaner and shorter :)

> 
> What this example was supposed to illustrate is that it's easy to forget to 
> explicitly duplicate an array, especially if it's not clear who's 
> responsible--the caller or the callee. 

I don't think the example illustrates that.  It illustrates that there are 
convoluted ways to try and explicitly use appending to duplicate arrays, and 
why one shouldn't do that.

-Steve

Reply via email to