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”
。