我们可以在defmodules中使用匿名函数吗?

时间:2016-06-20 06:27:24

标签: elixir

我们可以做像

这样的事吗
defmodule EmailMatch do
    match_email = fn(id) -> Regex.run ~r/[a-zA-Z]+\s*\@[a-zA-Z]+\.[a-z]+/, id end
end

并使用它:

EmailMatch.match_email("bdn@sdkj.net")

虽然上面给出了:

** (UndefinedFunctionError) undefined function EmailMatch.match_email/1
    EmailMatch.match_email("bdn@sdkj.net")

2 个答案:

答案 0 :(得分:4)

是的,此代码有效,但您无法从模块外部访问该功能,甚至无法从模块内的def访问该功能。我猜你的意思是“这不行”,因为它对我来说很好。您可以直接在defmodule

中的其他表达式中调用它
defmodule EmailMatch do
  match_email = fn(id) -> Regex.run ~r/[a-zA-Z]+\s*\@[a-zA-Z]+\.[a-z]+/, id end
  IO.inspect match_email.("foo@bar.com")
end

输出:

["foo@bar.com"]

如果您希望此功能仅在模块中的其他def内可用,则可以使用defp来定义私有功能。

答案 1 :(得分:-1)

实际上我发现这只是一种语法糖,更容易做到。匿名函数绑定和调用另一个变量并不是我在文档中找到的东西。

defmodule EmailMatch do
  @moduledocs """
   matching email
  """
  def match_email(id), do:Regex.run ~r/[a-zA-Z]+\s*\@[a-zA-Z]+\.[a-z]+/, id

end

我想我将不得不这样做。