当您在地图上进行操作时,Elixir 中是否会保留键和值的顺序?

2024-04-11

假设我在 Elixir 中有一张地图:

m = %{"a"=>1, "b"=>2, "c" => 3}

如果我打电话Map.values(m),我能保证返回值永远是[1, 2, 3]按这个顺序而不是说,[3, 1, 2]?

这是我从文档中不清楚的一件事。经过一些初步测试,我认为是的。


Elixir 和 Erlang 中的 Map 实现有一些令人困惑的属性。对于较小的条目值,它是一个排序的键列表,因此似乎具有您在简单实验中看到的属性。

超过一定数量的条目(我认为是 32 个),实现会切换到哈希数组映射 Trie,并且您看到的所有属性都会消失。在一般情况下,您不能依赖于映射的键或值的顺序。看

https://en.wikipedia.org/wiki/Hash_array_mapped_trie https://en.wikipedia.org/wiki/Hash_array_mapped_trie

了解 Map 底层结构的解释。

 iex(7)> 1..33 |> Enum.reduce(%{}, fn(x, acc) -> Map.put(acc,x,x) end )
%{11 => 11, 26 => 26, 15 => 15, 20 => 20, 17 => 17, 25 => 25, 13 => 13, 8 => 8,   7 => 7, 1 => 1, 32 => 32, 3 => 3, 6 => 6, 2 => 2, 33 => 33, 10 => 10, 9 => 9,   19 => 19, 14 => 14, 5 => 5, 18 => 18, 31 => 31, 22 => 22, 29 => 29, 21 => 21,   27 => 27, 24 => 24, 30 => 30, 23 => 23, 28 => 28, 16 => 16, 4 => 4, 12 => 12} 

iex(8)> Map.keys(v(7)) [11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,  22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12] 

iex(9)> Map.values(v(7)) [11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,  22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当您在地图上进行操作时,Elixir 中是否会保留键和值的顺序? 的相关文章

  • 无法在 postgresql 10 中打开 Citext 的扩展控制文件

    我刚刚在 Fedora 28 中安装了 postgresql 10 然后我做了一个 mix ecto migrate 但它说 Postgrex Error 错误58P01 undefined file 无法打开扩展控制文件 usr pgsq
  • elixir 中嵌套列表和结构的 get_in

    我有一个结构 s a Bla b c 我要拿c从中获得价值 我正在尝试做 get in s a b 但它并不是为了从结构中获取价值而设计的 有没有类似的东西可以让我获取c从带有嵌套结构的列表中 As 有记录的 https hexdocs p
  • Elixir 变量真的是不可变的吗?

    在 Dave Thomas 的 Programming Elixir 一书中 他指出 Elixir 强制执行不可变数据 并接着说道 在 Elixir 中 一旦变量引用了诸如 1 2 3 之类的列表 您就知道它将始终引用相同的值 直到您重新绑
  • 在 mac M1 芯片上构建 docker amd64 镜像

    我正在尝试以两种方式在我的 mac M1 arm64 上构建 dockerfile 下面是 dockerfile 的重要部分 FROM erlang 24 elixir expects utf8 ENV ELIXIR VERSION v1
  • 使用 Ecto 的原始 SQL

    我对 Elixir 和 Phoenix Framework 的世界还很陌生 我正在尝试遵循 TheFireHoseProject 教程 但在使用 Ecto 查询原始 SQL 时遇到问题 该教程说这应该有效 defmodule Queries
  • Elixir 中的宏扩展:如何定义两个宏,一个使用另一个宏?

    我正在 Elixir 中尝试宏 因此 我要展示的代码当然应该使用简单的函数来完成 但是 我正在尝试 我想定义2个宏 A和B 并让A使用B来试验宏扩展 当我使用 A 时 我收到一个编译错误 指出function B is 不明确的 这是代码
  • 分布式 Elixir 示例不起作用

    我有一个非常简单的 Elixir 代码示例 我想在不同的节点上运行 第一个节点位于我的笔记本电脑上 第二个节点是 Raspberry Pi 通过 SSH 访问 代码很简单 node1 my computer defmodule Hello
  • Elixir 或 Erlang 程序可以编译为独立的二进制文件吗?

    它说 Elixir 有一个工具叫做elixircErlang 有一个工具叫做erlc to 编译模块 http elixir lang org crash course html elixir用来 在此之后 您可以立即运行代码elixir命
  • 在 Erlang 中删除字符串的子字符串/字符串模式

    我有一个 xml 字符串 例如 S b a a b b 我想删除结束标签 b S2 b a a b 我怎样才能实现这个目标 如果您只想删除特定的字符串文字 b 然后获取子列表就可以了 S b a a b b lists sublist S
  • 如何测试 Phoenix 套接字是否已终止?

    我正在寻找一种方法来测试套接字是否被终止 被测试的代码执行以下操作 def handle in logout payload socket do stop logout socket gt assign user nil end 和我的测试
  • 如何将 Elixir 库加载到 iex 中而不将其添加到项目的 mix.exs deps 中?

    我想尝试 Poison json 模块而不创建混合项目 如何安装它并通过导入使其在 iex 中可用 我已经能够将它添加到项目中 然后在进入项目目录并使用 iex S mix 后使用它 tbrowne LILJEN code elixirTr
  • 当您在地图上进行操作时,Elixir 中是否会保留键和值的顺序?

    假设我在 Elixir 中有一张地图 m a gt 1 b gt 2 c gt 3 如果我打电话Map values m 我能保证返回值永远是 1 2 3 按这个顺序而不是说 3 1 2 这是我从文档中不清楚的一件事 经过一些初步测试 我认
  • 打造 ecto 独一无二的领域

    如何制作一个字段unique在体外 我以为它和Ruby中的活动记录一样 但似乎不是 你想使用唯一约束 3 http hexdocs pm ecto Ecto Changeset html unique constraint 3 这与 Act
  • 仅针对使用通道而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

    我将节点应用程序纯粹用于带有 Redis PubSub 的 socket io 通道 目前我将其分布在 3 台机器上 并由其中一台机器上的 nginx 负载平衡提供支持 我想用 Phoenix 应用程序替换这个节点应用程序 而且我对 erl
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 启动混合任务流程依赖项

    Elixir 新手 但到目前为止很喜欢它 我的很多混音任务都依赖于 HTTPotion My mix exs文件被声明为这样 def application do applications logger cowboy plug httpot
  • Ecto 中按日期时间查询

    这是我尝试过的 date Ecto DateTime from erl calendar universal time query gt where record record deadline gt date 我也尝试过 date Ect
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de

随机推荐