Dart 语言中如何自定义新的运算符?
Dart 自定义
?: 类条件运算符的实现方案 核心结论
- Dart 仅支持重载预定义列表内的运算符,
?:是内置的三元条件运算符固定语法,不属于可重载的运算符范围,无法直接自定义完全一致的符号写法。 - 可通过「运算符重载+扩展方法」或「普通扩展方法」实现完全等价的逻辑效果。
实现方案1:用现有可重载运算符模拟
可以选择一个和业务场景无冲突的预定义运算符,结合扩展方法模拟你需要的效果:
// 对bool类型扩展,重载%运算符实现条件为假时执行回调 extension BoolConditionalExtension on bool { T? operator %<T>(T Function() fallback) { if (!this) return fallback.call(); return null; } }
使用示例:
// 效果等价于你想要的 condition ?: func() false % () => print('条件不成立,执行函数'); // 正常输出日志 true % () => print('条件成立,不执行'); // 无输出
你也可以根据自己的使用习惯替换为其他可重载运算符,比如|、^等。
实现方案2:语义化扩展方法(可读性更高)
如果不需要严格对标?:的符号写法,更推荐用语义化的普通扩展方法,代码可读性更高:
extension BoolConditionalExtension on bool { T otherwise<T>(T Function() fallback) { if (!this) return fallback.call(); // 条件成立时可根据业务需求调整返回值 return null as T; } }
使用示例:
(10 < 5).otherwise(() => print('10不小于5')); // 正常输出日志
补充说明
Dart 官方规定的可重载运算符列表如下:<、+、|、>、/、^、<=、~/、&、>=、*、<<、==、–、>>、[]、%、~、[]=,不在这个列表内的符号都无法自定义为运算符。
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

