在 Elixir 1.0.3 中,如何在不引用其模块的情况下引用函数中的模块变量?在其父范围内?
How can I refer to a module variable in a function without referring to its module in Elixir 1.0.3? In its parent scope?
我想让 Elixir 1.0.3 中的函数引用其 "parent" 范围内的变量。在这种情况下,它的父作用域是一个模块。
这是我在上一个问题中使用的相同代码:
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
它编译得很好,但如果我尝试 msgurr 函数,我会收到以下错误:
** (UndefinedFunctionError) undefined function: Rec.counter/0
Rec.counter()
recursion_and_import_test.exs:5: Rec.msgurr/2
我还尝试了以下方法:
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
不过,我在这里收到编译时警告:
➜ ubuntu 长生不老药 recursiontest.exs
recursion_and_import_test.exs:1: 警告:重新定义模块 Rec
recursion_and_import_test.exs:2: 警告:变量计数器未使用
recursion_and_import_test.exs:4: 警告:未使用导入 Rec
当我尝试使用 msgurr 函数时:
➜ ubuntu iex
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll: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
我似乎无法将我自己的变量从模块导入到该模块内的函数中。
我已经查看了导入文档,但我似乎无法从中理解如何做这类事情。我应该检查 Erlang 文档吗?
您混淆了模块和对象。
Rec.counter
总是指Rec Module里面的函数。这就是错误消息告诉您的内容,它们找不到函数。模块不能像您想象的那样具有变量。
模块可以有属性。虽然有可能捏造你想要的
对于模块属性,如果您想使用 Rec.counter 引用它,您应该只将 returns 设为常量的函数。
def counter do
"done!"
end
关于模块属性还有很多here,但是如果你想能够在elixir中思考,你需要开始思考"functions not variables"。
我想让 Elixir 1.0.3 中的函数引用其 "parent" 范围内的变量。在这种情况下,它的父作用域是一个模块。
这是我在上一个问题中使用的相同代码:
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
它编译得很好,但如果我尝试 msgurr 函数,我会收到以下错误:
** (UndefinedFunctionError) undefined function: Rec.counter/0
Rec.counter()
recursion_and_import_test.exs:5: Rec.msgurr/2
我还尝试了以下方法:
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
不过,我在这里收到编译时警告: ➜ ubuntu 长生不老药 recursiontest.exs recursion_and_import_test.exs:1: 警告:重新定义模块 Rec recursion_and_import_test.exs:2: 警告:变量计数器未使用 recursion_and_import_test.exs:4: 警告:未使用导入 Rec
当我尝试使用 msgurr 函数时:
➜ ubuntu iex Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll: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
我似乎无法将我自己的变量从模块导入到该模块内的函数中。
我已经查看了导入文档,但我似乎无法从中理解如何做这类事情。我应该检查 Erlang 文档吗?
您混淆了模块和对象。
Rec.counter
总是指Rec Module里面的函数。这就是错误消息告诉您的内容,它们找不到函数。模块不能像您想象的那样具有变量。
模块可以有属性。虽然有可能捏造你想要的 对于模块属性,如果您想使用 Rec.counter 引用它,您应该只将 returns 设为常量的函数。
def counter do
"done!"
end
关于模块属性还有很多here,但是如果你想能够在elixir中思考,你需要开始思考"functions not variables"。