我刚开始学习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。
我该怎么做?一种好的/默认的方法是什么?如果不能,为什么?
尽管乍一看语法可能与 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作为提示