如何在Elixir中获取结构体名称?

22
假设我有一个结构体,struct = %MyApp.MyModel{ filled_with_data: "true }

如何获取结构体的名称(在我的例子中为MyApp.MyModel)?

4个回答

36

它存储在名为__struct__的字段中,因此struct.__struct__ == MyApp.MyModel


28

您还可以通过模式匹配获取结构名称:

%name{} = struct

1
太棒了,没想到你可以用模式匹配来实现! - Cory ODaniel
我喜欢这个,因为它不依赖于 :__struct__ 映射键,这是一个实现细节。 - Nathan Long

3
如果你需要将结构体的名称作为字符串返回而不包含 "Elixir." 前缀,但保留任何模块前缀,可以这样做:
name = your_map.__struct__
       |> Module.split
       |> Enum.join(".")

对于 your_map.__struct__ 的等效写法(其中 your_map 是一个 Ecto.Schema.t 结构体),我刚才在 iex 中的结果中没有得到 Elixir. 前缀。 - Kenny Evitt

2

结构体在其中携带__struct__字段。因此,

struct.__struct__

应该做什么?

@Dogbert 首先赢了! - Alex Antonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接