2017-02-09 1 views
-1

Sagen wir, ich habe 2 Module.Verschachtelte Module und Zugriff "@variable"

defmodule Mod1 do 
    @var1 123 
end 


defmodule Mod1.Mod2 do 
    def func1 do 
    @var1 * 10 # how ???? 
    end 
end 

Gibt es eine Möglichkeit, auf @ var1 zuzugreifen, ohne dafür eine spezielle Funktion in Mod1 erstellen zu müssen?

defmodule Mod1 do 
    @var1 123 

    def var1_getter do # only for Mod2 
    @var1 123   # any other way??? 
    end 
end 
+0

Ich rate, mehr Dokumentation zu lesen und lesen Sie sorgfältig "Programmierung Elixir", bevor Sie hier fragen. – PatNowak

+0

@PatNowak, aaahhhhhaaaaahhhaa – Torito

Antwort

3

Gibt es eine Möglichkeit @ var1 zuzugreifen, ohne dass eine spezielle Funktion für sie in Mod1 erstellen zu müssen?

Nein, gibt es nicht. Modulattribute existieren nur zur Kompilierzeit und wenn Sie ihre Werte offen legen wollen, müssen Sie sie von einer öffentlichen Funktion zurückgeben.

Es gibt auch nichts Besonderes an verschachtelten Modulen in Elixir, außer dass der Name des Elternmoduls ein Präfix des Namens seiner Kinder ist. Nach der Kompilierung sind sie vollständig separate Module, die zufällig Mod1 und Mod1.Mod2 genannt wurden.

+0

Es ist erwähnenswert, dass ['Kernel. @'] (Https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2399) ist ein einfaches, altes, gutes Makro, das im Grunde ein ausgeklügelter Check-fähiger Alias ​​für ['Module.put_attribute/3'] ist (https://hexdocs.pm/elixir/Module.html#put_attribute/3). – mudasobwa

+0

Elixir ist weit von OOP entfernt, daher sind verschachtelte Module keine verschachtelten Klassen und Modulattribute sind weit entfernt von Klassenfeldern. – PatNowak

+0

Sie können ein Makro '__USING__' definieren und alle Ihre Attribute innerhalb des Makros schreiben und sie in Ihr Modul laden, wie dieses 'use module_name' – Ankanna

Verwandte Themen