Dart中能否同时使用可选位置参数与命名参数?
Dart可选位置参数与命名参数的使用问题
你的假设不正确,Dart完全允许同时使用可选位置参数和命名参数,核心规则是:可选位置参数必须放在命名参数之前。
你的代码报错原因
你写的函数定义逻辑没问题,但报错大概率是以下细节问题:
- 检查
LogType枚举是否已正确定义,未定义的自定义类型会导致解析错误,触发类似“Expected to find ')'”的提示; - 部分旧版Dart编辑器可能对可选位置参数与命名参数之间的逗号敏感,尝试去掉
[Object? s2 = '']后面的逗号再试。
无需将第二个字符串设为命名参数的解决方案
直接修正函数定义即可实现你想要的调用方式,完整可运行代码如下:
// 先确保LogType枚举已定义(如果之前没定义的话) enum LogType { misc, debug, error } // 假设全局变量已初始化 int lowestDisplayedPriority = 1; Set<LogType> activeLogs = {LogType.misc}; void log(Object? s, [Object? s2 = ''], {int priority = 1, LogType logType = LogType.misc, bool on = true}){ if (priority >= lowestDisplayedPriority && activeLogs.contains(logType) && on){ print('=' + s.toString()); if(s2 != ''){ print('=' + s2.toString()); } } } // 调用示例,完全符合你的需求 void main() { log('A', 'B', priority: 2); log('A', priority: 2); }
这样你就能按log(A,B, priority: 2)或log(A, priority: 2)的方式调用函数,无需将第二个字符串设为命名参数。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

