如何在ADT转换时选取可选列表首元素并处理空值场景?
解决方案
问题核心是:当OptVal可选项被省略时,ADT里的opt参数会是空列表,但你写的prettyOptVal只处理了OptVal::optVal()的存在场景,没有匹配空列表的情况,导致运行报错。
可以通过两种方式解决:
方式一:扩展prettyOptVal函数,覆盖空列表场景
修改prettyOptVal,新增对空列表的匹配分支,直接返回空字符串(注意给"OPTIONAL"加空格,避免和后续标识符连在一起):
public str prettyOptVal([]) = ""; public str prettyOptVal([OptVal::optVal()]) = "OPTIONAL ";
方式二:在prettyTakeAction中直接判断处理
在主打印函数里先检查opt是否为空,再决定是否拼接可选内容:
public str prettyTakeAction(TakeAction::set(list[OptVal] opt, str expandedId, NumVal numVal)) = "SET " + (opt == [] ? "" : prettyOptVal(opt)) + expandedId + " = " + prettyNumVal(numVal);
调整后,输入SET a = 8时,opt为空列表会返回空字符串,最终输出SET a = 8;输入SET OPTIONAL a = 3时,正常输出格式化后的SET OPTIONAL a = 3。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

