如何访问struct定义的模块中的struct [Elixir]

时间:2016-10-04 13:58:50

标签: elixir

我刚开始学习Elixir,但是有一些编程背景,有几种OOP语言,主要是Ruby。我找到了如何在模块中定义struct的示例:

defmodule Example.User do
  defstruct name: "Sean", roles: []
end

另外,我发现在创建结构时可以设置此值: steve = %Example.User{name: "Steve", roles: [:admin, :owner]} 并且只需拨打steve.name

就可以在模块外部访问它

问题是,我如何访问结构数据INSIDE模块,所以假设我想从 call_my_name 函数访问名称字段:

defmodule Example.User do
  defstruct name: ""
  def call_my_name do
     IO.write(???)
  end 
end
martin = %Example.User{name: "Martin"}

就OOP而言,我只想写一个 getter

我该怎么办?这样做的好/默认方式是什么?如果我不能,为什么?

2 个答案:

答案 0 :(得分:5)

只是在这里堆积,您不需要在自己的模块中使用完整的命名空间,只要您没有其他用户模块可供参考。试试这个:

defmodule Example.User do
  alias __MODULE__ # <- this is the magic

  defstruct [:name]

  def my_fun(%User{} = user)
    IO.inspect(user)
  end
end

感谢https://dockyard.com/blog/2017/08/15/elixir-tips提示

答案 1 :(得分:3)

虽然语法最初可能与Ruby类似,但Elixir 不是一种OOP语言。你没有&#34;方法&#34;在Elixir。相反,您需要显式调用该函数并传入struct:

defmodule Example.User do
  defstruct name: ""

  def call_my_name(%Example.User{name: name}) do
     IO.write(name)
  end 
end

martin = %Example.User{name: "Martin"}
Example.User.call_my_name(martin)