【发布时间】:2012-01-24 05:40:43
【问题描述】:
TDPL, p. 167:
只要函数中的可变状态完全是transitory(即,分配在堆栈上)和私有(即,不通过引用传递的函数)可能会污染它),那么该函数可以被认为是纯函数。
import std.stdio : writeln;
struct M{
int[4] _data;
pure ref int opIndex(size_t i){ return _data[i]; }
}
pure M foo(ref M m){
m[0] = 1234;
return m;
}
void main(){
M m1 = M([7, 7, 7, 7]);
writeln(m1);
foo(m1);
writeln(m1);
}
// output:
// M([7, 7, 7, 7])
// M([1234, 7, 7, 7])
可变状态是暂时的,因为它在堆栈上,对吗?但这不是私人的。那么foo()如何允许修改m1呢?
【问题讨论】:
-
我一直在尝试清理pure 标签,因为它有时指的是纯虚函数,有时指的是pure,有时指的是pure - 等等。但我对d 一无所知。您能否确认我的标签编辑是否合适? purely-functional 可以解决这个问题吗?我创建了pure-function,所以如果purely-functional 有效,我认为使用现有标签会更好。
-
@RichardJPLeGuen Pure 和functional purity 一样,所以纯函数可以解决这个问题。纯粹的功能,不是那么多。
-
.. 虽然Purely Functional 列在该维基百科页面的相关链接中。
标签: d pure-function