char[][] join ==> string
Ali Çehreli
acehreli at yahoo.com
Thu Apr 7 11:23:04 PDT 2011
On 04/07/2011 09:01 AM, Simen kjaeraas wrote:
> On Thu, 07 Apr 2011 02:13:16 +0200, bearophile
> <bearophileHUGS at lycos.com> wrote:
>
>> Given an array of strings std.string.join() returns a single string:
>>
>> import std.string;
>> void main() {
>> string[] a1 = ["hello", "red"];
>> string j1 = join(a1, " "); // OK
>> }
>>
>>
>> But in a program I need an array of mutable arrays of chars. If I join
>> the arrays I get a mutable array of chars. But I need a string:
>>
>> import std.string;
>> void main() {
>> char[][] a2 = ["hello".dup, "red".dup];
>> string j2 = join(a2, " "); // error
>> }
>>
>> Error: cannot implicitly convert expression (join(a," ")) of type
>> char[] to string
>>
>> .idup avoids the error:
>>
>> string j3 = join(a2, " ").idup; // OK
>>
>> Given the low efficiency of the D GC it's better to reduce memory
>> allocations as much as possible.
>> Here join() creates a brand new array, so idup performs a useless
>> copy. To avoid this extra copy do I have to write another joinString()
>> function?
>>
>> Bye,
>> bearophile
>
> Isn't this a prime case for std.exception.assumeUnique?
Almost. assumeUnique is too eager and tries to null its reference
parameter. Copying from std/exception.d:
immutable(T)[] assumeUnique(T)(ref T[] array) pure nothrow
{
auto result = cast(immutable(T)[]) array;
array = null;
return result;
}
And that fails as join's return type is not an lvalue.
We need a simplyAssumeUnique() that doesn't null the reference parameter
:); and it would have no value over casting other than communicating the
intent.
Ali
More information about the Digitalmars-d-learn
mailing list