首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高性能、安全、纯净的道路建设

高性能、安全、纯净的道路建设
EN

Stack Overflow用户
提问于 2013-12-08 19:48:18
回答 1查看 75关注 0票数 0

我正在尝试实现buildPath的一个变体,它是performant (最小堆活动)以及@safepure

到目前为止我的尝试是

代码语言:javascript
复制
/** 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;
}

但是由于parentscurrParent上的一致性问题,它没有编译。

代码语言:javascript
复制
/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 constparents,则代码会编译,这可能是可以接受的,但肯定不是很漂亮。

是否可以声明const class Dir-references (parents)的可变数组和对const对象(pathSlow)的可变引用?如果是这样的话,这将以一种优雅的方式解决这个问题。

注意,path()是文件系统树结构的成员函数,其中每个节点都包含对类Dir实例的引用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 20:20:54

听起来你想用

代码语言:javascript
复制
const(Dir)[] parents;

如果Dir是一个类,它将不允许您执行一个可以重新分配的const引用(我认为这是打算在某个时候更改的,有一个拉请求,不确定当前的状态是什么),但是您可以通过创建一个小数组来对它进行黑客攻击:

代码语言:javascript
复制
const(Dir)[1] pathSlow;

然后将其称为pathSlow[0]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20458184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档