gpt4 book ai didi

function - 使用rust 的嵌套动态功能对象

转载 作者:行者123 更新时间:2023-12-03 11:42:16 27 4
gpt4 key购买 nike

我正在尝试为嵌套函数调用构建对象。
想法是基于简单的通用表达式(例如f64 + f64)编写某些内容。
然后,Expr对象通过以下方式构建与解析的数学表达式类似的内容:
实现自己的算术运算并对其子代执行操作。
从理论上讲,然后将调用上层Expr对象,然后依次调用其子对象,并一直拥有它的子对象,直到找到没有子对象的Expr,并且结果可以向后传播。
但是,我无法满足有关移动对象的编译器的要求(以下代码无法编译)...
我将不胜感激任何帮助!

use std::ops::Add;

pub struct Expr {
children: (Box<Option<Expr>>, Box<Option<Expr>>), //children expressions
func: Box<dyn Fn(f64, f64) -> f64>, //expr's function
}

impl Add<Expr> for Expr {
type Output = Expr;

fn add(self, rhs: Expr) -> Self::Output {
let children = (Box::new(Some(self)), Box::new(Some(rhs)));
let mut res = Expr {
children,
func: Box::new(|l, r| -> f64 { 1. }), //dummy function to be replaced
};
res.func = Box::new(
|l, r| -> f64 {
(&res.children.0.unwrap().func)(l, r) + (&res.children.1.unwrap().func)(l, r)
}
);
res
}
}

最佳答案

问题是res.func存储在堆上的Box中,即使两个盒子都存储在同一个Expr中,它本身也没有连接到res.children。如果函数知道此Expr,那么一切都会很好,因为它可以使用Expr来访问children。但是它并不知道,它只是存储在一个容器中,而它所知道的只是在创建闭包时捕获的内容,或者是您提供给它的任何参数。 (当您查看自己的邮箱时,也不必查看邻居的邮箱,除非他们给了您 key 。)
更有意义的是在Expr上实现一个函数,该函数获取值,然后使用它们调用该函数,从而允许您编写更简单的闭包,如@kmdreko所评论。该函数可能看起来像这样:

impl Expr {
pub fn do_the_thing(self) -> Option<f64> {
let left = (*self.children.0)?.do_the_thing()?;
let right = (*self.children.1)?.do_the_thing()?;
Some((self.func)(left, right))
}
}
然后,这将使您简化 Add的实现:
impl Add<Expr> for Expr {
type Output = Expr;

fn add(self, rhs: Expr) -> Self::Output {
let children = (Box::new(Some(self)), Box::new(Some(rhs)));
Expr {
children,
func: Box::new(|l, r| l + r),
}
}
}

关于function - 使用rust 的嵌套动态功能对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66371068/

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