Sto provando a creare una struttura con un puntatore a funzione mutabile. L'ho configurato in modo che il puntatore della funzione sia inizializzato su una funzione particolare, ma la ruggine non riconosce il puntatore quando provo ad usarlo.Il modo giusto per avere i puntatori di funzione nella struttura
ottengo
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)
^~~~~~~~
Ecco il mio codice
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"));
}
Questo primo errore è imbarazzante. Il secondo, non ha senso per me. Ho intenzione di fare un problema al riguardo. – franklynd
È semplice: il compilatore pensa che stai provando ad eseguire un metodo implementato su 'Self', ma quello che vuoi è accedere al campo' get_func' e chiamarlo come metodo. – Limeth
Ho usato per associare il valore a un nuovo campo e quindi chiamarlo, ma questa soluzione è più elegante. – Limeth