我正在尝试实现一个高性能buildPath
的变体(最小堆活动)和@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
和非const而不是@safe const
和parents
非const,代码编译可能是可接受的但绝对不是很漂亮。
是否可以声明const class Dir
的可变数组 - 引用(parents
)和
对const对象(pathSlow
)的可变引用?如果是这样,那将以优雅的方式解决这个问题。
请注意,path()
是文件系统树结构的成员函数,其中每个节点都包含对类Dir
的实例的引用。
答案 0 :(得分:1)
听起来像是要使用
const(Dir)[] parents;
如果Dir是一个类,它不会让你做一个可以重新分配的const引用(我想这是打算在某个时候改变,有一段时间的拉请求,不知道当前是什么状态是),但你可以通过制作一个小数组来解决它:
const(Dir)[1] pathSlow;
然后将其称为pathSlow[0]
。