我正在查看from_raw_parts_mut
的代码:
transmute
它使用Repr
将&mut [T]
重新解释为Repr
。据我所知,> packageVersion("readtext")
[1] ‘0.3’
?readtext::readtext
readtext(file, ignore_missing_files = FALSE, textfield = NULL,
docvarsfrom = c("metadata", "filenames", "filepaths"), dvsep = "_",
docvarnames = NULL, encoding = NULL,
verbosity = getOption("readtext_verbosity"), ...)
是一个128位结构。这种不同大小的类型的转换是如何工作的?
答案 0 :(得分:5)
mem::transmute()
仅在转换为相同大小的类型时才起作用 - 这意味着&mut[T]
切片的大小也相同。
查看Repr
:
#[repr(C)]
struct Repr<T> {
pub data: *const T,
pub len: usize,
}
它有一个指向某些数据和长度的指针。这正是一个切片 - 一个指向项目数组的指针(可能是一个实际数组,或由Vec<T>
拥有,等等),其长度可以说明有多少项是有效的。
作为切片传递的对象(在封面下)正是Repr
的样子,即使它所引用的数据可以是0到T
之间的任何数据。将适合记忆。
在Rust中,一些引用不仅像其他语言一样实现为指针。有些类型是&#34;脂肪指针&#34;。这一开始可能并不明显,特别是如果你熟悉其他语言的参考/指针!一些例子是:
&[T]
和&mut [T]
实际上是指针和长度。边界检查需要长度。例如,您可以将对应于数组部分或Vec
的切片传递给函数。&Trait
或Box<Trait>
,其中Trait
是特征而不是具体类型,实际上是指向具体类型的指针和指向 vtable的指针 - 在对象上调用特征方法所需的信息,因为它的具体类型是未知的。