我正在尝试实现buildPath的一个变体,它是performant (最小堆活动)以及@safe和pure。
到目前为止我的尝试是
/** Returns: Path to $(D this) File. */
string path() @property @safe const pure {
const Dir[] parents;
// collect parenting Dirs
auto currParent = parent;
size_t pathLength = 0; // returned path length
while (currParent !is null) {
if (currParent !is parent) {
pathLength += 1;
}
pathLength += currParent.name.length;
parents ~= currParent;
currParent = parent.parent;
}
// build path
auto path_ = new char[pathLength];
size_t i = 0;
foreach (currParent_; parents) {
const parentName = currParent_.name;
if (i != 0) {
path_[++i] = '/';
}
path_[i .. parentName.length] = parentName[];
i += parentName.length;
}
return path;
}但是由于parents和currParent上的一致性问题,它没有编译。
/home/per/Work/justd/fs.d(408): Error: cannot modify const expression parents
/home/per/Work/justd/fs.d(409): Error: cannot modify const expression currParent如果我将path()、@trusted和non替换为@safe const和parents,则代码会编译,这可能是可以接受的,但肯定不是很漂亮。
是否可以声明const class Dir-references (parents)的可变数组和对const对象(pathSlow)的可变引用?如果是这样的话,这将以一种优雅的方式解决这个问题。
注意,path()是文件系统树结构的成员函数,其中每个节点都包含对类Dir实例的引用。
发布于 2013-12-08 20:20:54
听起来你想用
const(Dir)[] parents;如果Dir是一个类,它将不允许您执行一个可以重新分配的const引用(我认为这是打算在某个时候更改的,有一个拉请求,不确定当前的状态是什么),但是您可以通过创建一个小数组来对它进行黑客攻击:
const(Dir)[1] pathSlow;然后将其称为pathSlow[0]。
https://stackoverflow.com/questions/20458184
复制相似问题