在D中使用lambdas创建变量函数不能用作class \ struct成员

时间:2012-06-11 17:41:16

标签: lambda d currying

我一直在玩D,试图通过链接lambda表达来模仿Scala style curryable functions

我想出了这个:

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));
}

这是我运行时得到的结果:

global  3
struct  1528543170
Segmentation fault

正如您所看到的,我的方法适用于全局函数变量,但struct的静态函数变量会产生垃圾结果,而类的静态函数变量完全失败。 如果我从返回表达式中删除x - function(immutable int x)=>(immutable int y)=>(y) - 结构版本提供了正确的结果(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));
}

它运作得很好:

global  3
struct  3
class   3

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

我很清楚D在curry库中有std.functional函数用于调整函数,但有时候在默认情况下使函数可以调整更方便,而且旁边 - 我很好奇知道为什么我的第一个版本不起作用。

有什么想法吗?

更新

好的,I've filed a bug。我已经做了一些挖掘,结果发现foo的参数列表被移位了,这就是x获取垃圾数据的原因。

1 个答案:

答案 0 :(得分:4)

老实说,看起来你遇到了编译错误。 Please report it。由于struct和class中的变量是静态的,因此它们的行为应该与模块级变量的行为相同,显然,它不是。