我一直在玩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 curry在std.functional库中具有用于调整函数的功能,但是有时候在默认情况下创建一个可以调用的函数会更加舒适,而且旁边 - 我很想知道为什么我的第一个版本不起作用.
有任何想法吗?
UPDATE
好的,我已经提交了一个错误.我已经做了一些挖掘,结果发现了转换的参数列表foo,这就是x获取垃圾数据的原因.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |