【问题标题】:in Dart, is there a `parse` for `bool` as there is for `int`?在 Dart 中,“bool”是否有“解析”,就像“int”一样?
【发布时间】:2014-02-03 17:11:16
【问题描述】:

在 Dart 中,有一种将 String 转换为 int 的便捷方法:

int i = int.parse('123');

是否有类似的转换布尔值的方法?

bool b = bool.parse('true');

【问题讨论】:

    标签: parsing boolean dart coercion


    【解决方案1】:

    没有。只需使用:

    String boolAsString;
    bool b = boolAsString == 'true';
    

    【讨论】:

    • 我在 Checkbox State 值上使用了这个,非常有帮助。
    【解决方案2】:

    Bool 没有方法。

    var val = 'True';
    bool b = val.toLowerCase() == 'true';
    

    应该很容易。

    借助支持扩展方法的最新 Dart 版本,可以使代码看起来更像 intnumfloat

    extension BoolParsing on String {
      bool parseBool() {
        return this.toLowerCase() == 'true';
      }
    }
      
    
    void main() {
      bool b = 'tRuE'.parseBool();
      print('${b.runtimeType} - $b');
    }
    

    另见https://dart.dev/guides/language/extension-methods

    致@remonh87 的评论 如果你想要精确的'false' 解析,你可以使用

    extension BoolParsing on String {
      bool parseBool() {
        if (this.toLowerCase() == 'true') {
          return true;
        } else if (this.toLowerCase() == 'false') {
          return false;
        }
        
        throw '"$this" can not be parsed to boolean.';
      }
    }
    

    【讨论】:

    • 或者,也许:bool b = val.toLowerCase() == true.toString().toLowerCase();,如果你够怪到这种程度。
    • 当这应该通过提供的解析方法来处理时,不想在你的应用程序周围存储一堆常量,比如“true”,这并不奇怪。很“奇怪”,我们必须编写这种毫无意义且重复的代码……如果 Dart 意识到序列化对现实世界的应用程序有多么重要,并使其更像是一种一流的操作,那么 Dart 将是一种更好的语言.它只是一个又一个的杂物,无论是枚举、对象序列化,还是世界上最基本的东西,一个布尔值。 C# 做到了这一点,而 dart 中存在如此多的尖角,因为它们没有。
    • @shawnblais 我不一定不同意,但您应该知道 C# 大约早在 15 年前就开始了,而且可能从一开始就拥有更多的资源。 Dart 还可以很好地完成一些 C# 不能或非常糟糕的事情,比如编译到 C#,不确定热重载,可能还有其他事情,未来可能还会更多。 Linux 中的 C# 仍然很差,.​​..
    • 哦,是的,dart 中有很多比 c# 更好的地方,我并不是真的要让它们互相对抗。在 Dart 中存在序列化/数据类的巨大漏洞真是太可惜了,因为在该领域存在如此多的现有技术(如 c#),因为在该领域,它几乎与正常运行的 http 调用堆栈一样重要。我想不出我曾经做过的单个应用程序不需要在某些时候将数据序列化到磁盘。当枚举/布尔值之类的基本事物不容易序列化时……这真的很烦人。听起来元编程可能会派上用场!
    • @remonh87 我更新了我的答案以演示准确的错误处理,而不是所有不是 "true" 的东西都被视为错误。
    【解决方案3】:

    你不能像你描述的 bool.parse('true') 那样执行这个操作,因为 Dart SDK 尽可能是轻量级的。

    Dart SDK 不像 NET Framework 那样统一,所有基本系统类型都有以下统一。

    IConvertible.ToBoolean
    IConvertible.ToByte
    IConvertible.ToChar
    IConvertible.ToDateTime
    IConvertible.ToDecimal
    IConvertible.ToDouble
    IConvertible.ToInt16
    IConvertible.ToInt32
    IConvertible.ToInt64
    IConvertible.ToSByte
    IConvertible.ToSingle
    IConvertible.ToString
    IConvertible.ToUInt16
    IConvertible.ToUInt32
    IConvertible.ToUInt64
    

    这些类型也有parse方法,包括Boolean类型。

    所以你不能以统一的方式做到这一点。只能靠自己。

    【讨论】:

      【解决方案4】:

      其实是的,有!

      就这么简单

      bool.fromEnvironment(strValue, defaultValue: defaultValue);
      

      请记住,您可能需要这样做strValue.toLowerCase()

      【讨论】:

      • 根据文档,如果 String 是 truefromEnvironment 返回 true。奇怪的是,在实践中这是行不通的。即使输入字符串为truebool.fromEnvironment 也始终返回 false。
      • 'fromEnvironment'返回一个环境变量值,它不返回'strValue'是真还是假。
      猜你喜欢
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2011-10-25
      • 2019-10-10
      相关资源
      最近更新 更多