2016-05-22 9 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) 
         ^~~~~~~~ 

यहाँ मेरी कोड

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

यह आसान है - संकलक सोचता है कि आप 'सेल्फ' पर लागू की गई विधि को निष्पादित करने का प्रयास कर रहे हैं, लेकिन आप जो चाहते हैं वह 'get_func' फ़ील्ड तक पहुंचना है और इसे इसके बजाय विधि के रूप में कॉल करना है। – Limeth

+0

मैं मान को एक नए क्षेत्र में बांधने के लिए उपयोग करता था और फिर इसे कॉल करता था, लेकिन यह समाधान अधिक सुरुचिपूर्ण है। – Limeth