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
}