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
Reference 如何将引用的元组转换为元组的引用?_Reference_Rust - Fatal编程技术网

Reference 如何将引用的元组转换为元组的引用?

Reference 如何将引用的元组转换为元组的引用?,reference,rust,Reference,Rust,我想将引用的元组(都是对同一结构的成员的引用)转换为元组的引用 我试着用各种方式强迫他们,但是没有克隆我是做不到的 structbar(); 结构Foo(Bar,Bar,Bar); fn main(){ 设a:&Foo=&Foo(Bar(),Bar(),Bar()); 设b:&(Bar,Bar)=&(a.0,a.1); } 错误[E0507]:无法移出借用的内容 -->src/main.rs:7:28 | 7 |设b:&(Bar,Bar)=&(a.0,a.1); |^^^无法移出借用的内容 错

我想将引用的元组(都是对同一结构的成员的引用)转换为元组的引用

我试着用各种方式强迫他们,但是没有克隆我是做不到的

structbar();
结构Foo(Bar,Bar,Bar);
fn main(){
设a:&Foo=&Foo(Bar(),Bar(),Bar());
设b:&(Bar,Bar)=&(a.0,a.1);
}
错误[E0507]:无法移出借用的内容
-->src/main.rs:7:28
|
7 |设b:&(Bar,Bar)=&(a.0,a.1);
|^^^无法移出借用的内容
错误[E0507]:无法移出借用的内容
-->src/main.rs:7:33
|
7 |设b:&(Bar,Bar)=&(a.0,a.1);
|^^^无法移出借用的内容
我希望
b
属于
类型和(条形,条形)
给定
a
属于
&Foo类型这是不可能的

引用引用一个值。您希望有一个
&(Bar,Bar)
,但内存中没有一个地方有
(Bar,Bar)
的两元组。你不能引用不存在的东西

&(A,B)
(&A,B)
的内存布局基本上是不兼容的,因此也不能使用不安全的防锈技术


在这种特殊情况下,可能会使用不安全的锈迹将
&Foo
直接转换为
&(条形,条形)
,但是

  • 它要求元组结构和元组的布局相同;我不知道这是可以保证的
  • 它要求对元组结构的布局进行紧密打包,这样就可以通过成员大小进行偏移,从而到达下一个元组结构;我不知道这是可以保证的
  • 它要求元组结构的布局按照定义的顺序放置成员;我不知道这是可以保证的
  • 您只能对连续的片段执行此操作;没有得到第一和第三项

1——事实上:

元组对其布局没有任何保证

例外情况是单位元组(
()
),它保证为零大小类型,大小为0,对齐方式为1

这意味着,虽然此代码可能会打印出您期望的内容,而Miri不会抱怨,但这是未定义的行为。

这是不可能的

引用引用一个值。您希望有一个
&(Bar,Bar)
,但内存中没有一个地方有
(Bar,Bar)
的两元组。你不能引用不存在的东西

&(A,B)
(&A,B)
的内存布局基本上是不兼容的,因此也不能使用不安全的防锈技术


在这种特殊情况下,可能会使用不安全的锈迹将
&Foo
直接转换为
&(条形,条形)
,但是

  • 它要求元组结构和元组的布局相同;我不知道这是可以保证的
  • 它要求对元组结构的布局进行紧密打包,这样就可以通过成员大小进行偏移,从而到达下一个元组结构;我不知道这是可以保证的
  • 它要求元组结构的布局按照定义的顺序放置成员;我不知道这是可以保证的
  • 您只能对连续的片段执行此操作;没有得到第一和第三项

1——事实上:

元组对其布局没有任何保证

例外情况是单位元组(
()
),它保证为零大小类型,大小为0,对齐方式为1


这意味着,虽然此代码可能会打印出您期望的内容,而Miri不会抱怨,但这是一种未定义的行为。

您很可能正在经历错误。几乎可以肯定的是,有一种更好的方法可以解决导致您提出此问题的根本问题。您很可能正在经历一场灾难。几乎可以肯定,有一种更好的方法可以解决导致您提出此问题的根本问题。
// I copied this unsafe block from Stack Overflow
// without properly documenting why I think this code is safe.
let b: &(Bar, Bar) = unsafe { &*(a as *const Foo as *const (Bar, Bar)) };
println!("{:?}", b);
// I copied this unsafe block from Stack Overflow
// without properly documenting why I think this code is safe.
let c: &(Bar, Bar) = unsafe {
    let p = a as *const Foo as *const Bar;
    let p = p.offset(1);
    &*(p as *const (Bar, Bar))
};
println!("{:?}", c);