Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
September 16, 2016 Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Hi! I was just playing with array initialization and copying and discovered that this syntax works as expected but it is not referenced under https://dlang.org/spec/arrays.html#array-copying: -----8><----- int[3] s; int[3] t; s = t; -----8><----- Is it safe to use or do I have to use the proposed 's[] = t;' or 's[] = t[]' ? Thank's! |
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Antonio Corbi | On Friday, 16 September 2016 at 17:03:20 UTC, Antonio Corbi wrote:
> Is it safe to use or do I have to use the proposed 's[] = t;' or 's[] = t[]' ?
That works for all arrays. `s = t` for dynamically sized arrays (aka slices) just sets the references to the same, but for your statically sized arrays, it also copies.
|
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Friday, 16 September 2016 at 17:11:54 UTC, Adam D. Ruppe wrote: > On Friday, 16 September 2016 at 17:03:20 UTC, Antonio Corbi wrote: >> Is it safe to use or do I have to use the proposed 's[] = t;' or 's[] = t[]' ? > > That works for all arrays. `s = t` for dynamically sized arrays (aka slices) just sets the references to the same, but for your statically sized arrays, it also copies. Thank's Adam! That's what my toy program told me: ---------------8><------------------ import std.stdio; alias matrix = uint[3][2]; int main(string[] args) { matrix s; matrix t = [[1,2,3], [4,5,6]]; writeln ("s= ", s); writeln ("s.ptr= " , s.ptr); writeln ("t= ", t); writeln ("t.ptr= " , t.ptr); writeln ("t[1][2]= ", t[1][2]); s = t; writeln ("s= ", s); writeln ("s.ptr= " , s.ptr); return 0; } ---------------8><------------------ ...but I wanted to be sure! :) Shouldn't it be mentioned then in the docs that this works for statically sized arrays and that in that case it copies contents? |
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Antonio Corbi | On Friday, September 16, 2016 17:22:41 Antonio Corbi via Digitalmars-d-learn wrote:
> Shouldn't it be mentioned then in the docs that this works for statically sized arrays and that in that case it copies contents?
Well, I confess that I don't know why you would ever have thought that
s = t;
wouldn't work. The only mutable types that can't be assigned to like this are the ones that have disabled assignment or copying (which would only be certain structs).
And I thought that the spec made it clear that static arrays were value types, in which case the behavior of
s = t;
should be obvious. So, I would have thought that it would be clear enough as-is, but clearly, it wasn't for you. So, I don't know. We do want the spec to be clear, but it would also be bad to add a bunch of redundant information in an attempt to be clearer. I'd have to go digging through the spec though to give any concrete suggestions on how to improve this though.
- Jonathan M Davis
|
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On Friday, 16 September 2016 at 17:55:59 UTC, Jonathan M Davis wrote: > On Friday, September 16, 2016 17:22:41 Antonio Corbi via Digitalmars-d-learn wrote: >> Shouldn't it be mentioned then in the docs that this works for statically sized arrays and that in that case it copies contents? > > Well, I confess that I don't know why you would ever have thought that > > s = t; > > wouldn't work. The only mutable types that can't be assigned to like this are the ones that have disabled assignment or copying (which would only be certain structs). > > And I thought that the spec made it clear that static arrays were value types, in which case the behavior of > > s = t; > > should be obvious. So, I would have thought that it would be clear enough as-is, but clearly, it wasn't for you. So, I don't know. We do want the spec to be clear, but it would also be bad to add a bunch of redundant information in an attempt to be clearer. I'd have to go digging through the spec though to give any concrete suggestions on how to improve this though. > > - Jonathan M Davis Hi Jonathan! Probably this entry in https://dlang.org/spec/arrays.html#usage confused me a bit. int[3] s; ... s = ...; // error, since s is a compiled in static // reference to an array. Thanks for your help! Antonio |
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Antonio Corbi | On 9/16/16 2:03 PM, Antonio Corbi wrote: > Hi Jonathan! > > Probably this entry in https://dlang.org/spec/arrays.html#usage confused > me a bit. > > int[3] s; > .... > s = ...; // error, since s is a compiled in static > // reference to an array. > > Thanks for your help! > Antonio Yeah, that's bad. https://github.com/dlang/dlang.org/pull/1474 -Steve |
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Friday, 16 September 2016 at 18:12:22 UTC, Steven Schveighoffer wrote:
> On 9/16/16 2:03 PM, Antonio Corbi wrote:
>
>> Hi Jonathan!
>>
>> Probably this entry in https://dlang.org/spec/arrays.html#usage confused
>> me a bit.
>>
>> int[3] s;
>> ....
>> s = ...; // error, since s is a compiled in static
>> // reference to an array.
>>
>> Thanks for your help!
>> Antonio
>
> Yeah, that's bad.
>
> https://github.com/dlang/dlang.org/pull/1474
>
> -Steve
Hi Steve,
Way clearer (at least for me) with your patch!
Thanks,
Antonio
|
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Antonio Corbi | On 9/16/16 2:28 PM, Antonio Corbi wrote:
> On Friday, 16 September 2016 at 18:12:22 UTC, Steven Schveighoffer wrote:
>> On 9/16/16 2:03 PM, Antonio Corbi wrote:
>>
>>> Hi Jonathan!
>>>
>>> Probably this entry in https://dlang.org/spec/arrays.html#usage confused
>>> me a bit.
>>>
>>> int[3] s;
>>> ....
>>> s = ...; // error, since s is a compiled in static
>>> // reference to an array.
>>>
>>> Thanks for your help!
>>> Antonio
>>
>> Yeah, that's bad.
>>
>> https://github.com/dlang/dlang.org/pull/1474
>>
>> -Steve
>
> Hi Steve,
>
> Way clearer (at least for me) with your patch!
Hah, except it's actually wrong :) s = a compiles.
I don't know what that line is supposed to mean now...
-Steve
|
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On 09/16/2016 10:11 AM, Adam D. Ruppe wrote: > On Friday, 16 September 2016 at 17:03:20 UTC, Antonio Corbi wrote: >> Is it safe to use or do I have to use the proposed 's[] = t;' or 's[] >> = t[]' ? > > That works for all arrays. `s = t` for dynamically sized arrays (aka > slices) just sets the references to the same, but for your statically > sized arrays, it also copies. > > A short section of mine about that difference: http://ddili.org/ders/d.en/slices.html#ix_slices.assignment,%20array Ali |
September 16, 2016 Re: Array Copying syntax | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On 9/16/16 2:48 PM, Steven Schveighoffer wrote: > On 9/16/16 2:28 PM, Antonio Corbi wrote: >> Way clearer (at least for me) with your patch! > > Hah, except it's actually wrong :) s = a compiles. > Updated, should be good now. -Steve |
Copyright © 1999-2021 by the D Language Foundation