模块属性Elixir

def*_*unt 0 erlang elixir

我是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)

谢谢

tko*_*wal 6

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不等待回复,因此它是非阻塞的.

这可能看起来很麻烦,但它解决了几个问题:

  • 你不会在Erlang中有读者,作家问题,因为所有的请求都是逐个处理的
  • 如果你的getter和setter需要一些复杂的操作,它们可以异步完成(不阻塞调用进程)

这种模式是如此常见,以至于被behaviour称为gen_server消除了大部分循环的样板.如果你仍然认为,有太多的样板写,你可以阅读我的文章(这是在Erlang)