2015-03-03 18 views
5

Elixir 1.0.3'te bir işlev yapmak istiyorum, "parent" kapsamındaki bir değişkeni ifade eder. Bu durumda, ana kapsamı bir modüldür. AşağıdakiElixir 1.0.3'teki modülüne başvurmadan bir işlevdeki bir modül değişkenine nasıl başvurabilirim? Ana kapsamda mı?

defmodule Rec do 
    counter = "done!" 
    def msgurr(text, n) when n <= 1 do 
    IO.puts text 
    IO.puts Rec.counter 
    end 

    def msgurr(text, n) do 
    IO.puts text 
    msgurr(text, n - 1) 
    end 
end 

Sadece iyi derler ama olsun: Aşağıdaki bunu değiştirirseniz

defmodule Rec do 
    def msgurr(text, n) when n <= 1 do 
    IO.puts text 
    end 

    def msgurr(text, n) do 
    IO.puts text 
    msgurr(text, n - 1) 
    end 
end 

:

İşte benim son soruya kullanılan olanla aynı kod Ben msgurr işlevini çalışırsanız hata:

** (UndefinedFunctionError) undefined function: Rec.counter/0 
    Rec.counter() 
    recursion_and_import_test.exs:5: Rec.msgurr/2 

şunlarla çalıştı:

defmodule Rec do 
    counter = "done!" 
    def msgurr(text, n) when n <= 1 do 
    import Rec 
    IO.puts text 
    IO.puts Rec.counter 
    end 

    def msgurr(text, n) do 
    IO.puts text 
    msgurr(text, n - 1) 
    end 
end 

Gerçi burada bir derleme zamanı uyarıları almak: 1: Uyarı: yeniden tanımlanması modül Rec recursion_and_import_test.exs: 2: Uyarı: değişken sayaç kullanılmamış olan ➜ ubuntu elixirc recursion_and_import_test.exs recursiontest.exs recursion_and_import_test.exs: 4: uyarı: msgurr işlevini kullanmaya teşebbüs kullanılmayan içe Rec

:

➜ ubuntu IEX Erlang/OTP 17 [Erts-6.3] [kaynak] [64-bit] [smp: 8: 8] [async-t hreads: 10] [çekirdek anket: false]

Interactive Elixir (1.0.3) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> import Rec 
nil 
iex(2)> Rec.msgurr("blah", 3) 
blah 
blah 
blah 
** (UndefinedFunctionError) undefined function: Rec.counter/0 
    Rec.counter() 
    recursiontest.exs:6: Rec.msgurr/2 

O modül içindeki bir fonksiyonu içine modülünden kendime ait bir değişken ithal etmek mümkün görünmektedir.

İçe aktarma belgelerini gözden geçirdim, ancak bu tür bir işlemin nasıl yapılacağından çok emin değilim. Erlang belgelerini kontrol etmeli miyim?

cevap

4

Nesneleri Nesnelerle karıştırıyorsunuz.

Rec.counter 

zaman Rec Modül içinde yaptığı faaliyetleri belirtir. Hata mesajlarının size söylediği şey bu, fonksiyonu bulamıyorlar. Modüller, onları düşündüğünüz şekilde değişkenlere sahip olamaz.

Modüller, özniteliklere sahip olabilir. Bir modül özniteliği ile istediğini uydurmak mümkün olsa da, sadece Rec.counter kullanarak başvurmak istiyorsanız bir sabit döndüren bir işlev yapmalısınız.

def counter do 
    "done!" 
end 

modülünde fazlası var here niteliklerini, ancak iksir düşünmek mümkün isterseniz "değişkenleri işlevleri değil" düşünmeye başlamak gerekir.

+0

Konuşma, neden sadece öznitelikler yerine değişkenlere izin vermiyor? Her türlü işlevsel programlamayla ilgili deneyimim yok. Benim için bir tür keyfi var gibi görünse de, bana bir tür keyfi geliyor. –

+2

Modül değişkenleri, işlevsel programlamanın ilkelerinden birini kıran değişken duruma işaret eder. Bir yorumda neler yapabileceğimin çok daha fazlası var. Bu konuyu https://groups.google.com/forum/?hl=tr!konu/elixir-lang-talk/jvl9THiFFEI –

+2

Ayrıca, "modül değişkeni" ile bir işlev arasındaki çakışmaların olabileceği Python'da "yerel" gibi şeylerden kaçınmaktır. Belirsizliği ortadan kaldırmak ve açık bir notasyonu tanıtmak daha temizdir çünkü bu, niyetini işaret eder (yani, ihtiyacınız olan bir yer olması için @attribute kullanırsınız). –