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?
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. –
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 –
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). –