我是Elixir/Erlang编程的新手.
如何为Elixir模块实现模块属性,因此我的模块用户可以在模块构造函数中设置.
例如,
defmodule Config do
some_property: nil
other_property: nil
def constructor(one, two) do
some_property = one
other_property = two
end
def get_property_one do
some_property
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢
Elixir模块不是类,其中定义的变量不是属性,因此没有构造函数和析构函数之类的东西.Elixir基于Erlang,所以首先,我会推荐一些关于Erlang和面向对象编程的阅读:
这应该给你基本的想法,为什么不支持带有getter和setter的对象.使对象具有状态的最接近的事情是使服务器具有状态.所以在服务器循环中,你可以这样做:
def loop(state) do
newstate = receive do
{ :get_property_one, pid } ->
pick_the_property_from_state_and_send_to_pid(state, pid)
state
{ :set_property_one } ->
set_property_one_and_return_new_state(state)
end
loop(newstate)
end
Run Code Online (Sandbox Code Playgroud)
使用构造函数生成具有初始状态的新服务器即将创建新对象.发送:get_property_one类似于getter,但是异步(您可以在等待回复之前执行其他操作).发送:set_property_one不等待回复,因此它是非阻塞的.
这可能看起来很麻烦,但它解决了几个问题:
这种模式是如此常见,以至于被behaviour称为gen_server消除了大部分循环的样板.如果你仍然认为,有太多的样板写,你可以阅读我的文章(这是在Erlang)