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 ...


Reply via email to