Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 长生不老药在地图上作自我参照_Dictionary_Elixir - Fatal编程技术网

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,