2016-10-04 29 views
3

我剛開始學習Elixir,但有一些編程背景和幾種OOP語言,主要是Ruby。我發現的例子,我如何定義模塊內部結構:如何訪問struct定義的模塊結構[Elixir]

defmodule Example.User do 
    defstruct name: "Sean", roles: [] 
end 

另外,我發現當我創建結構,我可以設置這個值: steve = %Example.User{name: "Steve", roles: [:admin, :owner]} 並且只需通過調用steve.name

的訪問外模塊問題是,我怎麼能訪問模塊內部結構數據,讓我們說,我想從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

我該怎麼辦?什麼是良好的/默認的方式來做到這一點?如果我不能,爲什麼?

回答

3

儘管語法最初看起來可能類似於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) 
+0

感謝您的回覆,我真的很感激。我知道這不是OOP,我只是想澄清一些事情。結合數據和相關操作的好/默認方法是什麼?我應該只在模塊內部定義結構和函數,以便我可以將結構傳遞給這個函數?是否有任何確切的概念/想法,爲什麼我無法訪問數據? –

+0

@YarTheGreat創建結構和函數以「修改」這些結構的方法是合理的。但不要試圖將結構作爲對象。我將_modify_放在引號之間,因爲在功能語言中,您不會修改數據,您只需在修改後創建原始數據的副本。 –

+0

嘿,你還可以解釋這個函數聲明,爲什麼我們可以聲明這樣的參數:「call_my_name(%Example.User {name:name})」或者當我能夠閱讀這個表單時給我一個源代碼?它提醒我靜態樣式聲明,而我們使用動態語言。這種形式的戒備還是什麼?從未見過它。 –

0

只是堆在這裏,你不需要用你自己的模塊內完整的命名空間,只要你不有另一個用戶模塊來引用。試試這個:

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

    defstruct [:name] 

    def my_fun(%User{} = user) 
    IO.inspect(user) 
    end 
end 

感謝https://dockyard.com/blog/2017/08/15/elixir-tips的提示

相關問題