You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xtext验证问题:如何检测球员列表中的重复名称?

问题分析与修复方案

你的验证代码没生效主要是两个关键问题导致的,我帮你拆解并给出修正后的实现:

1. 错误标记的目标不对

你现在把错误绑定到了FOOTBALLPACKAGE.Literals.FOOTBALL__PLAYERS_LIST(也就是Football类的playerList属性),这会让错误提示显示在整个俱乐部的球员列表上,甚至可能因为Xtext的验证上下文匹配规则,导致错误根本不显示。正确的做法应该是把错误标记在重复的那个球员引用条目上,也就是PlayerList类的players特征。

2. 可以补充防御性判断

虽然你的Xtext语法里playerList是必填项,但加上空指针判断能让代码更健壮,避免意外情况。另外,方法名也建议改成更贴合业务的名字,方便后续维护。


修正后的验证代码

@Check
def checkDuplicatePlayerNames(Football model) {
    val names = newHashSet<String>()
    // 防御性判断,避免playerList为空的情况
    if (model.playerList != null) {
        for (player : model.playerList.players) {
            // 确保player实例不为空(语法约束下一般不会出现,但加上更稳妥)
            if (player != null && !names.add(player.name)) {
                // 错误标记在重复的球员引用上,用PlayerList的players特征
                error("Player name '" + player.name + "' is duplicated in the list", 
                      player, 
                      FOOTBALLPACKAGE.Literals.PLAYER_LIST__PLAYERS)
            }
        }
    }
}

额外的语法简化提示

你的Xtext语法里PlayerList的定义可以简化一下,效果完全一样:

PlayerList: players+=[Player]* ;

players+=[Player]*等价于你原来写的players+=[Player] (players+=[Player])*,代码更简洁。


内容的提问来源于stack exchange,提问作者JDoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:28