2016-05-22 8 views
5

私は可変ポインタを持つ構造体を作ろうとしています。関数のポインタが特定の関数に初期化されるように設定していますが、それを使用しようとすると錆がポインタを認識しません。私は構造体に関数ポインタを持つ正しい方法

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

を取得

は、ここであなたは自分のコード内の2個の単純なエラーを持っているように見えます私のコード

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

答えて

4

です。あなたはこの

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

にこの

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

を変更する場合、それは動作します。構文self.get_func(self, key)がなぜ機能しないのかわかりません。それはたぶん錆のコンパイラの見落としです。

+0

最初のエラーは恥ずかしいです。第二のものは、私には意味をなさない。私はそれについて問題を起こすつもりです。 – franklynd

+1

これは簡単です - コンパイラは 'Self'で実装されているメソッドを実行しようとしていると思っていますが、' get_func'フィールドにアクセスして代わりにメソッドとして呼び出すだけです。 – Limeth

+0

私は、新しいフィールドに値をバインドし、それを呼び出すのに使用しましたが、この解決法はより洗練されています。 – Limeth

関連する問題