我试图创建一个具有可变函数指针的 struct .我对它进行了设置,以便将函数指针初始化为特定的函数,但当我try 使用它时,rust无法识别指针.

我明白了

hello.rs:24:14: 24:22 error: no method named `get_func` found for type `&Container` in the current scope
hello.rs:24         self.get_func(self, key)
                         ^~~~~~~~

这是我的密码

use std::collections::HashMap;

struct Container {
    field: HashMap<String, i32>,
    get_func: fn(&Container, &str) -> i32
}

fn regular_get(obj: &Container, key: &str) -> i32 {
    obj.field[key]
}

impl Container {
    fn new(val: HashMap<String, i32>) -> Container {
        Container {
            field: val,
            get_func: regular_get
        }
    }

    fn get(&self, key: &str) -> i32 {
        self.get_func(self, key)
    }
}

fn main() {
    let mut c:HashMap<String, i32> = HashMap::new();
    c.insert("dog".to_string(), 123);
    let s = Container::new(c);
    println!("{} {}", 123, s.get("dog"));
}

推荐答案

看起来代码中只有两个简单的错误.如果你改变这个

fn get(&self, key: &str) -> Container
{
    self.get_func(self, key)
}

对这个

fn get(&self, key: &str) -> i32
{
    (self.get_func)(self, key)
}

那就行了.我不知道为什么语法self.get_func(self, key)不起作用;这可能只是rust编译器中的一个疏忽.

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

为什么我需要在这个代码示例中使用&

限制未使用的泛型导致编译错误

有没有办法在Rust中配置常量变量的值?

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

将一个泛型类型转换为另一个泛型类型

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

如何实现Deref;多次;?

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

try 从标准输入获取用户名和密码并删除 \r\n

我可以用 Rust 编写一个不可变变量

如何基于常量在Rust中跳过一个测试

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

rust tokio::spawn 在 mutexguard 之后等待

如何在 Rust 中返回通用 struct

在 FFI 的上下文中,未初始化是什么意思?

在 RefCell 上borrow

tokio async rust 的 yield 是什么意思?

如何创建动态创建值并向它们返回borrow 的工厂?

为什么可以从不可变 struct 的字段中移动?