Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 我怎么能有一个属性,它接受一个可变的引用,而这个引用将比它本身更有效?_Rust - Fatal编程技术网

Rust 我怎么能有一个属性,它接受一个可变的引用,而这个引用将比它本身更有效?

Rust 我怎么能有一个属性,它接受一个可变的引用,而这个引用将比它本身更有效?,rust,Rust,基本上我有这个结构(省略了不必要的细节): struct-Environment选项声明 struct-Environment,并在此类型中 环境:通过拥有一个&mut引用链,我们允许这些引用的持有者修改该链任何级别的任何部分,特别是用不同的引用替换这些引用。但是为了做到这一点,他们需要用具有相同寿命的东西来替换它-这个结构的形状是一个嵌套链,随着寿命的延长而变长,因此,例如,取两个环境并通过结构的形状对它们进行变异以交换位置,但这会破坏生命 有一点是可能的,但没有您想要的那么灵活,那就是在结

基本上我有这个结构(省略了不必要的细节):

struct-Environment选项声明

struct-Environment
,并在此类型中

  • 环境
    :通过拥有一个
    &mut
    引用链,我们允许这些引用的持有者修改该链任何级别的任何部分,特别是用不同的引用替换这些引用。但是为了做到这一点,他们需要用具有相同寿命的东西来替换它-这个结构的形状是一个嵌套链,随着寿命的延长而变长,因此,例如,取两个
    环境
    并通过结构的形状对它们进行变异以交换位置,但这会破坏生命

    有一点是可能的,但没有您想要的那么灵活,那就是在结构内部使用不可变的引用。为了演示这一点,这里有一个简单的范围检查器:

    使用std::collections::HashSet;
    枚举树{
    定义(字符串),
    使用(字符串),
    区块(Vec),
    }
    结构环境{
    环境{
    家长:没有,
    符号:HashSet::new(),
    }
    }
    fn检查{
    父项:选项>,
    符号:哈希集,
    }
    
    包含
    选项>
    ,这正是我之前告诉您不要做的。只要
    'e
    'r
    活得长,
    环境
    的原因。另一方面,可变引用要求不变性:它们必须完全匹配。(这是因为对于不可变引用,数据只能从中流出,但如果给定可变引用,数据可以流入或流出,因此如果在任一方向上存在生存期不匹配,则数据将不可靠。)

    我上面所写的警告是,不可能对链上更远的环境进行变异,如果您正在执行类型推断(以便用户可以确定声明的类型),您可能需要这样做。我不完全确定,但我认为为了做到这一点,你需要借助于内部的可变性,让你在没有可变性引用的情况下变异某些东西

    下面是修改为使用内部可变性工具的上述示例
    std::cell::RefCell
    。请注意,这段代码实际上并没有使用额外的灵活性——但它确实存在;通过使用显式运行时选中的
    .symbols.borrow_mut()
    操作,可以修改任何父级的
    符号

    使用std::cell::RefCell;
    使用std::collections::HashSet;
    枚举树{
    定义(字符串),
    使用(字符串),
    区块(Vec),
    }
    结构环境{
    环境{
    家长:没有,
    符号:RefCell::new(HashSet::new()),
    }
    }
    fn检查
    
    let x = 1  // parent environment
    let f(y) = {
      // current environment
      x + y
    }