在D中用lambdas创建可curryable函数不能用作class\struct memebers

Ida*_*rye 6 lambda d currying

我一直在玩D,试图通过链接lambda表达式来模仿Scala风格的可编辑函数.

我想出了这个:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
    static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}
class C     static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}

void main()
{
    writefln("global\t%s",foo(1)(2));
    writefln("struct\t%s",S.foo(1)(2));
    writefln("class\t%s",C.foo(1)(2));
}
Run Code Online (Sandbox Code Playgroud)

这是我运行时得到的:

global  3
struct  1528543170
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的方法适用于全局函数变量,但struct的静态函数变量给出了垃圾结果,而类的静态函数变量完全失败.如果我x从返回表达式中删除- function(immutable int x)=>(immutable int y)=>(y)- struct version提供正确的result(2),但类版本仍然失败.

如果我使用常规方法,而不是函数变量:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
    static auto foo(immutable int x)
    {
        return (immutable int y)=>(x+y);
    }
}
class C
{
    static auto foo(immutable int x)
    {
        return (immutable int y)=>(x+y);
    }
}

void main()
{
    writefln("global\t%s",foo(1)(2));
    writefln("struct\t%s",S.foo(1)(2));
    writefln("class\t%s",C.foo(1)(2));
}
Run Code Online (Sandbox Code Playgroud)

它运作得很好:

global  3
struct  3
class   3
Run Code Online (Sandbox Code Playgroud)

而且我也获得了使用委托的优势(编译器不允许在第一个版本中使用委托) - 但这种风格不那么优雅.

我很清楚D currystd.functional库中具有用于调整函数的功能,但是有时候在默认情况下创建一个可以调用的函数会更加舒适,而且旁边 - 我很想知道为什么我的第一个版本不起作用.

有任何想法吗?

UPDATE

好的,我已经提交了一个错误.我已经做了一些挖掘,结果发现了转换的参数列表foo,这就是x获取垃圾数据的原因.

Jon*_*vis 4

老实说,您似乎遇到了编译器错误。请举报。由于结构和类中的变量是静态的,因此它们的行为应该与模块级变量的行为相同,但显然,事实并非如此。