gpt4 book ai didi

rust - 在当前范围内找不到类型 *mut Y 的名为 X 的方法

转载 作者:行者123 更新时间:2023-11-29 08:22:04 25 4
gpt4 key购买 nike

我想在结构I 上调用方法a。有人告诉我 Rust 找不到方法,但不确定原因:

error: no method named `a` found for type `*mut I` in the current scope

--> src/lib.rs:7:16
|
7 | unsafe { i.a(5) }
| ^

这是一个最小的可重现示例:

extern crate libc;
use self::libc::int32_t;

#[no_mangle]
pub extern "C" fn i_a(i: *mut I) -> *mut int32_t {
unsafe { i.a(5) } // error: no method named `a` found for type `*mut I` in the current scope
}

#[derive(Debug, PartialEq)]
pub struct I {
pub values: Vec<i32>,
}

impl I {
pub fn a(&self, n: i32) -> i32 {
return 0;
}
}

我该如何解决这个问题?

最佳答案

让我们删除 extern C 的东西,它在这里没有用:

#[derive(Debug, PartialEq)]
pub struct I {
pub values: Vec<i32>,
}

impl I {
pub fn a(&self, n: i32) -> i32 {
return 0;
}
}

pub fn i_a(i: *mut I) -> i32 {
unsafe { i.a(5) }
}

问题是 Rust 中的指针极其有限:它们只有在 the primitive pointer type 上实现的方法.

基本上,您可以检查指针是否为空,比较它是否相等,执行一些算术运算并取消引用它。请注意,很少有指针操作实际上是不安全的(主要是算术和取消引用)。

要实际使用pointee,您首先需要解引用指针以从中获取引用;这是不安全的,但使用引用是安全的。

因此您可以将 i_a 重写为:

pub fn i_a(i: *mut I) -> i32 {
unsafe { (*i).a(5) }
}

或:

pub fn i_a(i: *mut I) -> i32 {
unsafe { &*i }.a(5)
}

然后它就会起作用。

关于rust - 在当前范围内找不到类型 *mut Y 的名为 X 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40489667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com