On Saturday, 25 January 2020 at 09:18:01 UTC, Basile B. wrote:
On Saturday, 25 January 2020 at 08:35:18 UTC, mark wrote:
I have this code:
import std.random;
import std.stdio;
void main()
{
auto aa = ["one": 1, "two": 2, "three": 3];
writeln(aa);
auto rnd = rndGen;
auto word = aa.byKey.choice(rnd);
writeln(word);
}
And in the D playground it gives this error:
onlineapp.d(8): Error: template std.random.choice cannot
deduce function from argument types !()(Result,
MersenneTwisterEngine!(uint, 32LU, 624LU, 397LU, 31LU,
2567483615u, 11LU, 4294967295u, 7LU, 2636928640u, 15LU,
4022730752u, 18LU, 1812433253u)), candidates are:
/dlang/dmd/linux/bin64/../../src/phobos/std/random.d(2599):
choice(Range, RandomGen = Random)(auto ref Range range, ref
RandomGen urng)
with Range = Result,
RandomGen = MersenneTwisterEngine!(uint, 32LU, 624LU,
397LU, 31LU, 2567483615u, 11LU, 4294967295u, 7LU, 2636928640u,
15LU, 4022730752u, 18LU, 1812433253u)
must satisfy the following constraint:
isRandomAccessRange!Range
/dlang/dmd/linux/bin64/../../src/phobos/std/random.d(2609):
choice(Range)(auto ref Range range)
I am treating aa as a set and want to pick a random word from
it.
What am I doing wrong?
I'm sorry I can't give a link to this code in the D playground
but the URL in the web browser is just https://run.dlang.io/
and when I click Shorten to get a URL nothing seems to happen
(using Firefox on Linux).
So the problem is that byKey is not a ref parameter, so you can
use array on it:
Well the explanation for your error is rather that byKey did not
verify isRandomAccesRange, i.e indexable by an index so .array on
it solve this.
pfff finally ...