minElement模板容器如何工作?

问题描述 投票:0回答:1

在下面的功能中,如果我将a更改为kv

void main()
{
    import std.algorithm.searching : minElement;
    import std.stdio : writeln;
    import std.array: byPair;

    long[string] aa = [
        "foo": 5,
        "bar": 10,
        "baz": 2000
    ];
    writeln(aa.byPair().minElement!"a.value"().value); 
}

编译器将引发以下错误消息:

/ dlang / dmd / linux / bin64 /../../ src / phobos / std / functional.d-mixin-215(215):错误:未定义的标识符kv/dlang/dmd/linux/bin64/../../src/phobos/std/algorithm/searching.d(1351):错误:模板实例std.functional.binaryFun!(“ kv.value”,“ a” ,“ b”)。binaryFun!(Tuple!(字符串,“ key”,long,“ value”),Tuple!(string,“ key”,long,“ value”))实例化错误/dlang/dmd/linux/bin64/../../src/phobos/std/algorithm/searching.d(1314):从此处实例化:极值!(__ lambda2,“ kv.value”,MapResult!(__ lambda2,结果),元组!(字符串,“键”,长整数,“值”))/dlang/dmd/linux/bin64/../../src/phobos/std/algorithm/searching.d(1398):从此处实例化:极值!((a)=> a,“ kv.value”, MapResult!(__ lambda2,结果))/dlang/dmd/linux/bin64/../../src/phobos/std/algorithm/searching.d(3550):从此处实例化:极值!(“ kv.value”,MapResult!(__ lambda2,结果) )onlineapp.d(12):从此处实例化:minElement!(“ kv.value”,MapResult!(__ lambda2,Result))

但是仅使用"a.value"参数即可编译。 [a]是什么意思?

d
1个回答
0
投票

作为函数的字符串参数作为示例出现在std文档中的所有示例中,但是它们的运行时间和方式并没有得到很好的记录。您已经注意到,带有函数别名参数的std模板可以接收字符串,而不是实际函数。

然后使用unaryFunbinaryFun使用mixin或其他魔术将字符串转换为“实数”函数。它们将参数命名为ab,您可以使用它们。

[正如Adam D. Ruppe所指出的,您还可以传递minElement!(a => a.value)()minElement!((a){ return a.value; })之类的“常规”函数/代理,当然,参数名称取决于您。

© www.soinside.com 2019 - 2024. All rights reserved.