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

编程入门 行业动态 更新时间:2024-10-28 04:17:27
本文介绍了如何将引用元组转换为元组引用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

I'd like to convert a tuple of references (which are all references to members of the same struct) to a reference of a tuple.

我试图以各种方式胁迫他们,但如果不进行克隆我就无法做到.

I've tried to coerce them in various ways, however I wasn't able to do it without cloning.

struct Bar(); struct Foo(Bar, Bar, Bar); fn main() { let a: &Foo = &Foo(Bar(), Bar(), Bar()); let b: &(Bar, Bar) = &(a.0, a.1); }

error[E0507]: cannot move out of borrowed content --> src/main.rs:7:28 | 7 | let b: &(Bar, Bar) = &(a.0, a.1); | ^^^ cannot move out of borrowed content error[E0507]: cannot move out of borrowed content --> src/main.rs:7:33 | 7 | let b: &(Bar, Bar) = &(a.0, a.1); | ^^^ cannot move out of borrowed content

我希望 b 的类型为 &(Bar, Bar) 给定 a 的类型为 &Foo.

I expect b to be of type &(Bar, Bar) given a is of type &Foo.

推荐答案

这不可能.

引用引用到一个值.你希望有一个 &(Bar, Bar) 但内存中没有任何地方有 (Bar, Bar) 的 2 元组.你不能引用不存在的东西.

A reference refers to a value. You wish to have a &(Bar, Bar) but there is nowhere in memory that has a 2-tuple of (Bar, Bar). You cannot refer to something that does not exist.

&(A, B) 和 (&A, &B) 的内存布局根本不兼容,所以你也不能使用不安全的 Rust 技术.

The memory layouts of &(A, B) and (&A, &B) are fundamentally incompatible, so you cannot use unsafe Rust techniques either.

在这种特殊情况中,您可能能够使用不安全的 Rust 将您的 &Foo 直接转换为 &(Bar, Bar),但是...

In this particular case, you might be able to use unsafe Rust to convert your &Foo directly to a &(Bar, Bar), but...

  • 它要求元组结构和元组的布局相同;我不知道这是保证1
  • 它要求元组结构的布局紧密排列,以便您可以通过成员大小进行偏移以到达下一个;我不知道这是保证1
  • 它要求元组结构的布局按照它们定义的相同顺序放置成员;我不知道这是保证1
  • 你只能对连续的片段进行;没有得到第一和第三项
// 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);

1 — 事实上,引用明确指出:

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

Tuples do not have any guarantees about their layout.

唯一的例外是单元元组 (()),它保证为零大小类型,大小为 0,对齐方式为 1.

The exception to this is the unit tuple (()) which is guaranteed as a zero-sized type to have a size of 0 and an alignment of 1.

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

This means that while this code may print out what you expect and Miri does not complain, it's undefined behavior.

更多推荐

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

本文发布于:2023-07-13 03:25:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1099798.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:转换为   如何将

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!