2016-05-22 6 views
5

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")); 
} 

risposta

4

Sembra che basta avere due semplici errori nel codice. Se si modifica questa

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

a questo

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

allora funziona. Non so perché la sintassi self.get_func(self, key) non funzioni; probabilmente è solo una svista nel compilatore di ruggine.

+0

Questo primo errore è imbarazzante. Il secondo, non ha senso per me. Ho intenzione di fare un problema al riguardo. – franklynd

+1

È 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

+0

Ho usato per associare il valore a un nuovo campo e quindi chiamarlo, ma questa soluzione è più elegante. – Limeth

Problemi correlati