gpt4 book ai didi

arguments - 将参数列表中的类型实例传递到函数声明中(动态环境捕获)

转载 作者:行者123 更新时间:2023-11-29 08:14:36 24 4
gpt4 key购买 nike

我制作了一个实现优化算法的库 here .这些是相关函数和特征的签名:

pub fn cmaes_loop<T>(object: &T, options: CMAESOptions) -> Option<Vec<f64>>
where T: 'static + FitnessFunction

pub trait FitnessFunction {
fn get_fitness(&self, parameters: &[f64]) -> f64;
}

如果我将库应用于一个简单的问题,我可以根据给定的参数计算适应度。但是,假设我想针对给定的尺寸和 Material 优化机翼的形状:

struct Wing<'a> {
material: String,
size: i32,
parameters: &'a [f64]
}

我可以实现适应度函数以从其他字段中读取并将它们计入计算中,然后将 Wing 的实例提供给 cmaes_loop 函数以优化特定的 Material 和尺寸。我正在制作另一个将使用这个库的库。它优化了其他东西(比如 Wing),所以我有一个包装器特征来使第二个库更容易使用:

pub trait WingFitnessFunction {
fn get_fitness(&self, wing: &Wing) -> f64;
}

我这样实现 FitnessFunction 特性:

impl FitnessFunction for Wing {
fn get_fitness(&self, parameters: &[f64]) -> f64 {
let wing = Wing {
parameters: parameters,
.. self
};

// error here
let result = WingFitnessFunction::get_fitness(wing);
}
}

WingFitnessFunction 有一个 &self 参数,原因与 FitnessFunction 相同。我希望我的第二个库的用户能够传递实现 WingFitnessFunction 的他们类型的实例。我将 FitnessFunctionimpl 放入采用用户类型实例的函数主体中:

fn foo<T: WingFitnessFunction>(object: T) {
impl FitnessFunction for Wing {
...
object.get_fitness(wing)
}

但是当我尝试调用 objectget_fitness 方法时,我得到了这个错误:

can't capture dynamic environment in a fn item; use the || { ... } closure form instead

我需要知道如何在特定实例上调用 objectget_fitness 方法(闭包可以做到这一点,但我不知道如何实现使用 cmaes_loop 函数)。

最佳答案

我的问题的解决方案是添加一个包装器:

struct WingWrapper<'a, T: WingFitnessFunction> {
wing: Wing,
object: T
}

并为它实现FitnessFunction:

impl<'a, T: WingFitnessFunction> FitnessFunction for WingWrapper<'a, T> {
fn get_fitness(&self, parameters: &[f64]) -> f64 {
let wing = Wing {
parameters: parameters,
.. self.wing
}

self.object.get_fitness(&wing)
}
}

在将实现 WingFitnessFunction 的类型作为参数的函数中,首先构建一个 WingWrapper:

let wrapper = WingWrapper {
wing: // Instance of wing here
object: // Instance of object here (taken as an argument)
}

现在,您可以通过 FitnessFunction 中的方法调用 WingFitnessFunction 特征中的 get_fitness 方法:

println!("{}", wrapper.get_fitness(&[1, 2, 3]));

这不会给使用库增加任何困难;从用户的角度来看是完全一样的。

关于arguments - 将参数列表中的类型实例传递到函数声明中(动态环境捕获),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com