std :: ptr :: Unique没有名为offset的方法

时间:2017-05-31 05:03:15

标签: pointers rust

当我尝试使用nightly编译器编译以下代码时,出现错误:

#![feature(alloc)]
#![feature(unique)]
#![feature(heap_api)]
extern crate alloc;

use std::ptr::{Unique, self};
use alloc::heap;
use std::mem;

fn main() {
    unsafe {
        let align = mem::align_of::<i32>();
        let elem_size = mem::size_of::<i32>();
        let ptr = heap::allocate(elem_size*5, align);
        let a = Unique::new(ptr as *mut _);
        println!("{}", *a.offset(2));
    }
}

错误:

rustc 1.19.0-nightly (5de00925b 2017-05-29)
error: no method named `offset` found for type `std::ptr::Unique<_>` in the current scope
  --> <anon>:16:27
   |
16 |         println!("{}", *a.offset(2));
   |                           ^^^^^^

根据docs,应为offset定义Unique。我做错了什么?

1 个答案:

答案 0 :(得分:4)

与正在使用的代码相比,您正在阅读过时的文档。最新的夜间API可以在https://doc.rust-lang.org/nightly/std/ptr/struct.Unique.html找到。

以前,Unique通过.offset()特征获得Deref方法*mut T。此Deref impl已在2017 May 6th上删除,因为

  

主要区别在于我删除了Deref impl,因为显然 LLVM无法使用&ptr -> &ptr API 维护元数据。这被认为是阻止这种API稳定的阻滞剂。无论如何,这不符合人体工程学。

现在要获得*mut T,请致电.as_ptr()。这是一个值到值,而不是引用参考函数,因此可以解决LLVM问题。

println!("{}", *a.as_ptr().offset(2));
//                ^~~~~~~~