fn card_states_init(
mut cmds: Commands,
query_card: Query<(Entity, Option<&Children>), Added<Card>>,
query_card_none: Query<(Entity, Option<&CardNone>)>,
query_card_hover: Query<(Entity, Option<&CardHover>)>,
query_card_action: Query<(Entity, Option<&CardAction>)>,
) {
for (card, children) in query_card.iter() {
if let None | Some((_, None)) = children
.map(|c| c.iter().find_map(|c| query_card_none.get(*c).ok()))
.flatten()
{
let child = cmds.spawn(CardNone).id();
cmds.entity(card).add_child(child);
}
if let None | Some((_, None)) = children
.map(|c| c.iter().find_map(|c| query_card_hover.get(*c).ok()))
.flatten()
{
let child = cmds.spawn(CardHover).id();
cmds.entity(card).add_child(child);
}
if let None | Some((_, None)) = children
.map(|c| c.iter().find_map(|c| query_card_action.get(*c).ok()))
.flatten()
{
let child = cmds.spawn(CardAction).id();
cmds.entity(card).add_child(child);
}
}
}
我在写上面这行代码段的时候在思考, 我是否应该将这重复的四段代码修改为下面这样:
fn card_states_init(
mut cmds: Commands,
query_card: Query<(Entity, Option<&Children>), Added<Card>>,
query_card_none: Query<(Entity, Option<&CardNone>)>,
query_card_hover: Query<(Entity, Option<&CardHover>)>,
query_card_action: Query<(Entity, Option<&CardAction>)>,
) {
for (card, children) in query_card.iter() {
card_state_init(&mut cmds, children, card, &query_card_none);
card_state_init(&mut cmds, children, card, &query_card_hover);
card_state_init(&mut cmds, children, card, &query_card_action);
}
}
fn card_state_init<T: Component>(
cmds: &mut Commands,
children: Option<&Children>,
card: Entity,
query_card_state: &Query<(Entity, Option<&T>)>,
) {
if let None | Some((_, None)) = children
.map(|c| c.iter().find_map(|c| query_card_state.get(*c).ok()))
.flatten()
{
let child = cmds.spawn(CardNone).id();
cmds.entity(card).add_child(child);
}
}
这样修改乍一看确实简化了重复, 但是却引入了泛型, 如何后面这几个 state 在初始化的时候要单独处理就要么退回来重新用原本的方案再修改, 要么再写一种 init, 然后修改. 感觉不如一开始就不做这样的 "过早优化"