Dictionary 长生不老药在地图上作自我参照
我有这张地图Dictionary 长生不老药在地图上作自我参照,dictionary,elixir,Dictionary,Elixir,我有这张地图 %{ total: 38, value: 22 } 并希望添加键:ratio。有没有一种方法可以立即写下: %{ total: 38, value: 22, ratio: __SELF__.value / __SELF__.total } %{ total: 38, value: 22, ratio: __SELF__.value / __SELF__.total } 或者我需要创建另一张地图来实现这一点 谢谢所有数据都是不可变的,因此您必须始
%{
total: 38,
value: 22
}
并希望添加键:ratio
。有没有一种方法可以立即写下:
%{
total: 38,
value: 22,
ratio: __SELF__.value / __SELF__.total
}
%{
total: 38,
value: 22,
ratio: __SELF__.value / __SELF__.total
}
或者我需要创建另一张地图来实现这一点
谢谢所有数据都是不可变的,因此您必须始终创建新地图 一种简单的方法,假设您的地图名为
map
:
iex>Map.put(Map,:比率,Map.value/Map.total)
%{比率:0.5789473684210527,总数:38,数值:22}
如果您的意思是希望在映射已经存在之前创建映射,那么最好将total
和value
放入变量中,并使用它们来构建映射:
defmodule示例do
def make_map(总计,值)do
%{total:total,value:value,比率:value/total}
终止
终止
iex(1)>示例。制作地图(38,22)
%{比率:0.5789473684210527,总数:38,数值:22}
我真的希望避免将临时映射分配给变量
因为特定内存位置的数据是不可变的,elixir可以安全地使用指向新集合中这些内存位置的指针。因此,创建具有中间结果的临时变量不会使使用的内存量增加一倍。例如,如果您从一个包含100万个条目的映射开始,然后创建一个包含一个附加条目的新映射,则不会使用以下内容的总内存:
old_map new_map
| |
V V
1 million + ( 1 million + 1)
new_entry
|
V
1 + pointer_to_old_map
相反,您只使用以下内容的附加内存:
old_map new_map
| |
V V
1 million + ( 1 million + 1)
new_entry
|
V
1 + pointer_to_old_map
…再加上新地图的簿记。像这样:
old_map
^
|
new_map = %{ +, a: 10}
有没有一种方法可以立即写下:
%{
total: 38,
value: 22,
ratio: __SELF__.value / __SELF__.total
}
%{
total: 38,
value: 22,
ratio: __SELF__.value / __SELF__.total
}
是的:
现在,如果您有一个要添加比率键的地图列表:
data = [
%{total: 38, value: 22},
%{total: 40, value: 22},
%{total: 44, value: 22}
]
for %{total: t, value: v}=map <- data do
Map.put(map, :ratio, v/t)
end
在每次迭代
以理解之后,t
和v
的内存位置将立即进行垃圾收集,并在新映射中使用指向map
内存位置的指针。有意义。因为我真的不想将临时映射分配给变量,也不想为此构建函数,所以我将选择%{value:12,total:18}|>(&(map.put(&1,:ratio,&1.value/&1.total))。()
。不是很优雅,我想重复这些数字可能会更简单:%{value:12,total:18,ratio:12/18}
,当然数字不是静态的,而是来自昂贵的SQL查询。那么,你的函数工作得很好,但显然我更喜欢我的函数。:)您可以这样内联它:map |>(fn%{value:v,total:t}->%{value:v,total:t,ratio:v/t}end)。()
那些来自昂贵的SQL查询的数字不会以任何方式存储在内存中的变量中?很明显,您可以通过某种方式访问总量和价值。。。为什么要将它们放在一个自引用结构中,然后从该结构中检索它们,而不是直接使用它们,这是没有道理的。亚当的回答是对的。@MarkWilbur,