所有数据都是不可变的,因此您始终必须制作一张新 map。
一种简单的方法,假设您的 map称为map
:
iex> Map.put(map, :ratio, map.value / map.total)
%{ratio: 0.5789473684210527, total: 38, value: 22}
如果你的意思是你要创建的 map已经存在之前,那么这将是更好地把total
和value
成变量,并用它们来构建图:
defmodule Example do
def make_map(total, value) do
%{total: total, value: value, ratio: value / total}
end
end
iex(1)> Example.make_map(38, 22)
%{ratio: 0.5789473684210527, total: 38, value: 22}
说得通。由于我确实想避免将临时映射分配给变量或为此构建函数,因此我将继续
%{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查询的数字不会以任何方式存储在内存中的变量中吗?您显然可以以某种方式访问总值和价值...为什么要让它们成为自引用结构然后从结构中检索它们而不是直接使用它们并没有意义。亚当的答案是正确的。