如何使用变量来引用结构的键?

8 elixir

如何使用变量访问结构的字段:

  var1 = "key1"
  struct1 = %MyStruct{key1: "fdsfd", key2: 33}

  val1 = struct1[:????] # how to use var1 for "key1"?
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 7

使用String.to_existing_atom/1Map.get/2(作为结构实际上是地图):

iex(1)> defmodule MyStruct do
...(1)>   defstruct [:key1, :key2]
...(1)> end
iex(2)> var1 = "key1"
"key1"
iex(3)> struct1 = %MyStruct{key1: "fdsfd", key2: 33}
%MyStruct{key1: "fdsfd", key2: 33}
iex(4)> val1 = Map.get(struct1, String.to_existing_atom(var1))
"fdsfd"
Run Code Online (Sandbox Code Playgroud)

[:key],因为它使用的语法将不与由缺省结构工作Access,其具有由所述用户对每个结构来实现的协议.

String.to_existing_atom/1如果原子不存在但是使用比将任意输入转换为原子更安全会抛出错误,如果你有一个已经定义了该键的结构,它肯定会存在.有关详细信息,请参阅此问题.