Elixir 在函数模式匹配中使用存储在模块属性中的映射值

Elixir 在函数模式匹配中使用存储在模块属性中的映射值,elixir,Elixir,考虑到模块属性是在编译时解析的,我认为以下两行对是等效的,但是第二行生成了一个无法调用远程函数的错误。我试图做的是使用包含映射的模块属性作为enum。然后我想在函数中对enum的一个值进行模式匹配 @my_guard "bar" def foo(@my_guard), do: "bar" @my_map %{guard: "bar"} def foo(@my_map.guard), do: "bar" 您可以按以下方式定义函数,它将正常工作: def foo(unquote(@my_

考虑到模块属性是在编译时解析的,我认为以下两行对是等效的,但是第二行生成了一个
无法调用远程函数的错误。我试图做的是使用包含映射的模块属性作为
enum
。然后我想在函数中对
enum
的一个值进行模式匹配

@my_guard "bar" 

def foo(@my_guard), do: "bar"


@my_map %{guard: "bar"}

def foo(@my_map.guard), do: "bar"

您可以按以下方式定义函数,它将正常工作:

def foo(unquote(@my_map.guard)), do: "bar"
问题在于,您的示例在编译时会变成这样:

def foo(%{guard: "bar"}.guard), do: "bar"

这不是一个正确的模式匹配。

只要一个unquote就足够了:
def foo(unquote(@my_map.guard)),do:“bar”
@Dogbert是的,你是对的,没有真正考虑它,谢谢,这是有意义的。在本例中,编译器似乎可以将其一直转换为
def foo(“bar”),do:“bar”
。特别是因为我可以使用
@my\u new\u guard@my\u map.guard
在函数之前创建一个新属性,然后使用
def foo(@my\u new\u guard),所以可以使用:“bar”