颤振LinkedHashMap与python中的orderedDict比较
Posted
技术标签:
【中文标题】颤振LinkedHashMap与python中的orderedDict比较【英文标题】:flutter LinkedHashMap compared with orderedDict in python 【发布时间】:2021-07-19 12:23:20 【问题描述】:从去年秋天开始,我就是飘飘的宝贝。当我们使用颤振类型时,它们通常提供像 toString() 这样的通用特性。其中之一是 '.runtimeType
' 但是这种 'getting runtimeType
' 方法似乎在发布模式下不起作用,实际上在调试模式下运行良好。
假设我们有像Map amIMap = "key": "is key", "value": "is value",;
这样的法线贴图
通常我们认为这个变量的类型是'Map',但是print(amIMap.runtimeType);
在调试模式下的方法(这似乎不像在发布模式下工作)打印不是'Map'而是像LinkedHashMap
这样的东西,它可能在开发环境的方式略有不同,但LinkedHashMap
的概念基本相同。
那么问题来了。在这个链接'https://api.flutter.dev/flutter/dart-collection/LinkedHashMap-class.html'中,似乎上述情况下的打印类型是 Dart 团队真正想要的,它看起来真的很像 python 中的orderedDict。通过这个问题,我想确保LinkedHashMap
这个概念可以安全使用。我要说的是,我想知道是否像 python 中的“orderedDict”一样安全地保持与键及其对应值的顺序相同,无论在调试、配置文件、发布模式、dartpad 甚至平台等环境中比如android、ios、macos、linux、window、web!
由于我已经看到 runtimeType 在我的应用程序中的发布模式下无法正常工作,我担心在发布模式下的 sdk 可能会忘记键值对的顺序,就像 runtimeType 方法一样。
我问这个问题的原因是我需要强制对的顺序与我在 IDEA 中的 dart 代码完全相同,以便我可以将它们转换为相同格式的 json 字符串,然后对 json 进行哈希处理字符串,它们都具有完全相同的对顺序,使用 crypto 包的 sha256 散列方法。在散列之前,地图的顺序必须保持不变。让我害怕的是,颤振往往会因环境而异。另外,当我使用firestore插件时,我必须手动从firestore中对地图进行排序,因为它们的顺序与可以通过firebase控制台检查的顺序不同。这些问题似乎处于相似的背景中。所以我需要布尔值,如果linkedHashMap即使在发布模式下也要保存我的地图对的顺序,而不管flutter 2.0的各种平台,就像python中的orderedDict一样。
希望该领域的任何专家都以完全确信的经验回答这个问题。如果我在这个问题中留下不清楚甚至错误的地方,我会非常感谢您的 cmets,
提前谢谢你[:
【问题讨论】:
【参考方案1】:首先,您不应该将.runtimeType
用于除调试以外的任何事情。如您所见,输出确实不是那么稳定,因此很少用于任何事情。如果您需要检查给定对象是否与给定class
兼容,则应改为使用is
运算符。
其次,Dart 中的 Map()
构造函数( 语法相同)被记录为创建
LinkedHashMap
的实例。由于这是标准 SDK 和语言设计的一部分,因此这不会改变。此外,此行为将在所有运行 Dart 的平台上保持稳定。
但如果您想确保始终使用LinkedHashMap
,您可以通过从dart:collection
导入类来显式创建LinkedHashMap
的实例。
LinkedHashMap
记录为:
记住键的插入顺序,并按照它们插入映射的顺序对键进行迭代。值按其对应键的顺序迭代。更改键的值,当键已经在映射中时,不会更改迭代顺序,但删除键并再次添加将使其成为迭代顺序中的最后一个。
【讨论】:
这个答案很酷!好吧,最好的解决方案应该是在现实世界中做这些事情。谢谢你的回答[:以上是关于颤振LinkedHashMap与python中的orderedDict比较的主要内容,如果未能解决你的问题,请参考以下文章