如何在定义了结构的模块内部访问结构[Elixir]

Yar*_* V. 4 elixir

我刚开始学习Elixir,但是具有使用多种OOP语言(主要是Ruby)的编程背景。我找到了示例如何在模块内部定义结构:

defmodule Example.User do
  defstruct name: "Sean", roles: []
end
Run Code Online (Sandbox Code Playgroud)

另外,我发现我可以在创建结构时设置此值: steve = %Example.User{name: "Steve", roles: [:admin, :owner]} 并且可以通过调用在模块外部访问它 steve.name

问题是,如何访问结构数据INSIDE模块,所以让我说我想从call_my_name函数访问name字段:

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

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

我该怎么做?一种好的/默认的方法是什么?如果不能,为什么?

Dog*_*ert 7

尽管乍一看语法可能与 Ruby 相似,但 Elixir不是OOP 语言。Elixir 中没有“方法”。相反,您需要显式调用该函数并传入结构体:

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)
Run Code Online (Sandbox Code Playgroud)


小智 6

只是堆放在这里,只要您没有要引用的另一个User模块,就不需要在自己的模块中使用完整的名称空间。尝试这个:

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

  defstruct [:name]

  def my_fun(%User{} = user)
    IO.inspect(user)
  end
end
Run Code Online (Sandbox Code Playgroud)

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