Yapı

2016-05-22 23 views
5

Yapı işaretçisine sahip olmanın doğru yolu Değişken işlev işaretçisi olan bir yapı oluşturmaya çalışıyorum. Bunu, işlev işaretçisinin belirli bir işlev için başlatılmış olacak şekilde ayarlayın, ancak pas, kullanmayı denediğimde işaretçiyi tanımıyor.Yapı

i

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) 
         ^~~~~~~~ 

burada sadece kodunuzda iki basit hata var gibi görünüyor kodum

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

cevap

4

var olsun. Bu

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

bu

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

değiştirirseniz o zaman çalışır. Neden self.get_func(self, key) sözdizimi çalışmıyor bilmiyorum; Muhtemelen pas derleyicisindeki bir gözetimdir.

+0

Bu ilk hata embarassing. İkincisi, bana mantıklı gelmiyor. Bununla ilgili bir sorun yapacağım. – franklynd

+1

Bu basit - derleyici 'Self' üzerinde uygulanan bir yöntemi yürütmeye çalıştığınızı düşünüyor, ancak istediğiniz şey' get_func' alanına erişmek ve bunun yerine bir yöntem olarak adlandırmaktır. – Limeth

+0

Değeri yeni bir alana bağlar ve sonra arar, ancak bu çözüm daha zariftir. – Limeth