On Sunday, 6 December 2015 at 12:27:49 UTC, cym13 wrote:
On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote:
Hi! I have the following code:
int main(string[] argv)
{
import std.algorithm: sum;
import std.stdio: writeln;
uint[3] a1 = [1, 2, 3];
uint[] a2;
for (int i = 1; i <= 3; ++i)
a2 ~= i;
writeln("a1: ", sum(a1));
writeln("a2: ", sum(a2));
return 0;
}
This throws the error:
dummy.d(11): Error: template std.algorithm.iteration.sum
cannot deduce function from argument types !()(uint[3]),
candidates are:
/usr/include/dmd/phobos/std/algorithm/iteration.d(3916):
std.algorithm.iteration.sum(R)(R r) if (isInputRange!R &&
!isInfinite!R && is(typeof(r.front + r.front)))
/usr/include/dmd/phobos/std/algorithm/iteration.d(3927):
std.algorithm.iteration.sum(R, E)(R r, E seed) if
(isInputRange!R && !isInfinite!R && is(typeof(seed = seed +
r.front)))
So a dynamic array works just fine. In fact, if I uncomment
the line in question the program compiles and outputs the
correct value (for a2). Why does "sum" not work on static
arrays?
Regards
So that you do not shoot yourself in the foot too easily. A
static array is a value type so it is passed by value to
functions. If you pass a 1M array to a function... well, I
guesse you don't want to do that.
Can the template func `sum()` be made to take `ref` of a static
array?
The solution is to slice it: a1[].sum; That way you avoid
the problem.
While I understand the explanation of the current behavior, and
the work-around, this inconstancy of making func calls means
either the library, or the language leaves something to be
desired: i.e
dynamic array and static array cannot be used interchangeably:
(sure I'm not talking about array decl / allocation, the user
have to take different actions) I'm talking about a simple
function call to calc the sum of the array.
```
sum(static_array[]); // v.s.
sum(dynamic_array);
```
For example, if the user first decl a static array for fast
prototyping, and later changed mind to use dynamic array, then
s/he need to change the call all over the places.
(I hope you are not telling me, every time people should use:
```
array_func(any_array[]);
```
is the correct D-idiom to use array in a func call)