这个问题是在这question个问题之后提出的.
作为Rust的新手,我正在try 了解函数指针(FN)的初始化方式.以下是对我正在编写的应用程序的简短且简单得多的描述.
Controller
是用route: i32
值初始化的.稍后,该值可以被修改,并且所有旧值被存储在列表中,作为history of changes.
下面是一个‘lib.rs’示例内容:
use futures::future;
use random_number::random;
pub struct Controller {
pub route: i32,
pub running_history_modified_routes: Vec<i32>
}
impl Controller {
// a 'route' is initialized with an integer
pub fn new(p: i32) -> Controller {
Controller { route: p, running_history_modified_routes: Vec::new()}
}
// Subsequently, the 'route' may get a new value.
// Here, we are generating a random new value and storing that in
// vector, as history of changes to route.
pub fn compute_a_new_route (&mut self, using_seed: i32) -> &mut Controller {
// My confusion is around this initialization!
let as_function_pointer: fn(i32) -> i32 = free_function_generate_random_route_value;
let a_fresh_route = self.get_a_route_afresh(using_seed,as_function_pointer);
self.running_history_modified_routes.push(a_fresh_route);
self
}
fn get_a_route_afresh(&self, seed_as_higher_limit: i32, f:fn(i32) -> i32) -> i32 {
f(seed_as_higher_limit)
}
fn method_generate_random_route_value(&self,seed_as_higher_limit: i32) -> i32 {
random!(0 as i32, seed_as_higher_limit)
}
fn assoc_function_generate_random_route_value(seed_as_higher_limit: i32) -> i32 {
random!(0 as i32, seed_as_higher_limit)
}
}
fn free_function_generate_random_route_value(seed_as_higher_limit: i32) -> i32 {
random!(0 as i32, seed_as_higher_limit)
}
fn get_a_route_afresh(..)
接收函数指针并调用它以获得新的路由值(在本例中,这当然是一个随机数:-).
我有三个不同的候选函数指针(在上面的代码中注释):
- 控制器的实现方法
method_generate_random_route_value
- 控制器的关联功能
assoc_function_generate_random_route_value
- 模块的自由功能
free_function_generate_random_route_value
我的理解是,它们中的每一个都可以用来在调用same way!但是,当我这样做时,编译器不同意:
let as_function_pointer: fn(i32) -> i32 = self.method_generate_random_route_value;
他告诉我:
error[E0615]: attempted to take value of method `method_generate_random_route_value` on type `&mut Controller`
--> src/lib.rs:20:60
|
20 | let as_function_pointer: fn(i32) -> i32 = self.method_generate_random_route_value;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method, not a field
|
help: use parentheses to call the method
|
20 | let as_function_pointer: fn(i32) -> i32 = self.method_generate_random_route_value(_);
| +++
当然,当我使用关联或自由函数时,编译器和我都很高兴.
当需要函数指针时,我在(impl)方法的适用性方面错过了什么?
下面是Cargo.toml
条:
[package]
name = "FutureExperiment"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
random-number = "0.1.8"
[lib]
name="function_pointers_experiment"
path="src/lib.rs"