我刚开始学习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 。
我该怎么办?这样做的好/默认方式是什么?如果我不能,为什么?
答案 0 :(得分:5)
只是在这里堆积,您不需要在自己的模块中使用完整的命名空间,只要您没有其他用户模块可供参考。试试这个:
defmodule Example.User do
alias __MODULE__ # <- this is the magic
defstruct [:name]
def my_fun(%User{} = user)
IO.inspect(user)
end
end
答案 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)