Import 如何在函数中引用模块变量而不引用Elixir 1.0.3中的模块?在其父范围内?

Import 如何在函数中引用模块变量而不引用Elixir 1.0.3中的模块?在其父范围内?,import,module,scope,elixir,Import,Module,Scope,Elixir,我想让Elixir1.0.3中的函数引用其“父”范围内的变量。在本例中,其父作用域是一个模块 这里的代码与我在上一个问题中使用的代码相同: 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 我还尝试了以下方法: defmodule R

我想让Elixir1.0.3中的函数引用其“父”范围内的变量。在本例中,其父作用域是一个模块

这里的代码与我在上一个问题中使用的代码相同:

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
我还尝试了以下方法:

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
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
我似乎无法将自己的变量从模块导入该模块内的函数


我已经阅读了导入文档,但似乎无法从中理解如何做这类事情。我应该检查Erlang文档吗

您将模块与对象混淆

Rec.counter 
始终指Rec模块内的功能。这就是错误消息告诉您的,它们找不到函数。模块不能以您认为的方式包含变量

模块可以有属性。虽然有可能伪造你想要的东西 对于module属性,如果要使用Rec.counter引用它,则只需创建一个返回常量的函数

def counter do
  "done!"
end

还有更多关于模块属性的内容,但是如果你想用长生不老药思考,你需要开始思考“函数而不是变量”

说到这里,为什么不允许变量而不是属性呢?我缺乏任何函数式编程的经验。这对我来说似乎有点武断,尽管我知道一定有原因。模块变量意味着可变状态,这打破了函数式编程的原则之一。我可以在评论中谈的远不止这些。您可能会发现这个线程很有用,它还可以避免Python中出现类似于
local
的情况,在这种情况下,“模块变量”和函数变量之间可能存在冲突。消除歧义并引入显式表示法更为清晰,因为它表示意图(即使用@attribute,因为在某些地方需要它)。//,-----开始PGP签名------版本:OpenPGP Over 9000 WL4EABEKAAYFAL0WWAACGKQFOJ8AB4RGII0YGD+OA8XB9FV4AZOTQS4SJZOJD/r3xTN2V+kdTTndrkQ4EA/A2b+6+24v/U0TELL6MQ2FNHTQ5ZTFIFF2O9A/p1=SZgw------结束PGP签名-----
Rec.counter 
def counter do
  "done!"
end