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"));
}
Bu ilk hata embarassing. İkincisi, bana mantıklı gelmiyor. Bununla ilgili bir sorun yapacağım. – franklynd
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
Değeri yeni bir alana bağlar ve sonra arar, ancak bu çözüm daha zariftir. – Limeth