使用num.parse解析时,如何实现int与double互转?有无更优方案?
优化方案
你的代码逻辑是可行的,但可以通过更现代的Dart语法提升可读性和扩展性,下面是几种更优的实现方式:
方式一:使用模式匹配(Dart 3.0+)
利用Dart 3.0引入的switch模式匹配替换原有的if-else判断,代码结构更清晰,后续如果需要支持更多num子类也更容易扩展:
void main() { print(foo<int>('1')); print(foo<double>('1.0')); print(foo<double>('1')); print(foo<int>('1.0')); } T foo<T extends num>(String s) { final res = num.parse(s); return switch (T) { int => res.toInt() as T, double => res.toDouble() as T, _ => throw UnsupportedError('不支持的类型 $T'), }; }
方式二:直接调用对应类型的解析方法(严格解析场景)
如果你的需求是严格解析(比如输入'1.0'作为int类型时抛出错误,而非自动截断),可以直接调用int.parse或double.parse,这种方式更直接:
T foo<T extends num>(String s) { if (T == int) return int.parse(s) as T; if (T == double) return double.parse(s) as T; throw UnsupportedError('不支持的类型 $T'); }
注意:这种方式和你原代码的行为不同——原代码会将
'1.0'截断为1(int类型),而此方式会抛出FormatException。
原代码的轻量化优化
如果不想使用模式匹配,也可以把原代码的三目运算符拆分为更清晰的if-else结构,提升可读性:
T foo<T extends num>(String s) { final res = num.parse(s); if (T == double) { return res.toDouble() as T; } else if (T == int) { return res.toInt() as T; } else { throw UnsupportedError('不支持的类型 $T'); } }
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

