gpt4 book ai didi

generics - Rust需要帮助重构过多的功能

转载 作者:行者123 更新时间:2023-12-03 11:45:28 26 4
gpt4 key购买 nike

(我应该说我对 rust 病还很陌生)

你好!我使用Vec构建二维粒子模拟游戏,以使用每个粒子的信息保存结构。现在,我每次想检查某个元素是否接触具有特定属性的东西时,都需要编写一个单独的函数。基本上,它通过计算该位置的索引在圆周围搜索粒子,然后将struct属性与target属性进行比较,如下所示:

//check around particle for corrodable particles
pub fn check_touch_corrode(screen: &mut Vec<Particle>, x_pos: usize) -> usize {
if screen[calc::ul(x_pos)].corrode {return calc::ul(x_pos)} //if particle can corrode return particle
if screen[calc::u(x_pos)].corrode {return calc::u(x_pos)}
if screen[calc::ur(x_pos)].corrode {return calc::ur(x_pos)}
if screen[calc::l(x_pos)].corrode {return calc::l(x_pos)}
if screen[calc::r(x_pos)].corrode {return calc::r(x_pos)}
if screen[calc::dl(x_pos)].corrode {return calc::dl(x_pos)}
if screen[calc::d(x_pos)].corrode {return calc::d(x_pos)}
if screen[calc::dr(x_pos)].corrode {return calc::dr(x_pos)}
x_pos //else return own position
}

//check around particle for flammable particle
pub fn check_touch_flammable(screen: &mut Vec<Particle>, x_pos: usize) -> usize {
if screen[calc::ul(x_pos)].flammable {return calc::ul(x_pos)} //if particle flammable return particle
if screen[calc::u(x_pos)].flammable {return calc::u(x_pos)}
if screen[calc::ur(x_pos)].flammable {return calc::ur(x_pos)}
if screen[calc::l(x_pos)].flammable {return calc::l(x_pos)}
if screen[calc::r(x_pos)].flammable {return calc::r(x_pos)}
if screen[calc::dl(x_pos)].flammable {return calc::dl(x_pos)}
if screen[calc::d(x_pos)].flammable {return calc::d(x_pos)}
if screen[calc::dr(x_pos)].flammable {return calc::dr(x_pos)}
x_pos //else return own position
}

考虑到我计划拥有数百个具有各种不同属性和交互作用的元素,这实际上是不可扩展的。我真的很想知道是否有任何方法可以将其简化为一个功能。香港专业教育学院一直在我身边搞乱了一段时间,还没有取得任何进展。我遇到的问题是,需要在函数中计算比较,并且据我所知不能传递。有没有什么办法解决这一问题?像这样,所以我传递了一些信息,说它在计算出结构索引后要比较哪个结构?

最佳答案

我设法找到了解决方案!

pub fn check_touch(screen: &mut Vec<Particle>, x_pos: usize, criteria: impl Fn(Particle) -> bool,) -> usize {
if criteria(screen[calc::ul(x_pos)]) {return calc::ul(x_pos)}
//do this for every direction
}

然后像这样称呼它
check_touch(screen, x_pos, |p| p.corrode)

感谢r/Erelde在reddit上给我的建议

关于generics - Rust需要帮助重构过多的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62073003/

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