如何在Elixir控制台中定义命名函数而不获取**(ArgumentError)无法在模块外部调用def/2?
我可以在模块中定义命名函数,但我还没有掌握在iex>或ex>控制台中使用命名函数的诀窍 在尝试运行def命令时,我不断遇到以下错误:如何在Elixir控制台中定义命名函数而不获取**(ArgumentError)无法在模块外部调用def/2?,elixir,named,Elixir,Named,我可以在模块中定义命名函数,但我还没有掌握在iex>或ex>控制台中使用命名函数的诀窍 在尝试运行def命令时,我不断遇到以下错误: (ArgumentError) cannot invoke def/2 outside module pptime.exs IO.puts "initial division test" defmodule Expand do def transform(myvar) do 8 * myvar + 3; end end div
(ArgumentError) cannot invoke def/2 outside module
pptime.exs
IO.puts "initial division test"
defmodule Expand do
def transform(myvar) do
8 * myvar + 3;
end
end
div2 = fn inputnum ->
[:a, inputnum/2.0, inputnum/3, inputnum/5.0, inputnum/7]
end
output = div2.(20.1)
我可以用长生不老药很好地运行它,如下所示:
$ elixir pprime.exs
但是,在控制台中,我似乎无法执行任何此类操作:
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [async-threads:10] [kernel-poll:false]
Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> def transform(myvar) do 8 * myvar + 3; end
** (ArgumentError) cannot invoke def/2 outside module
(elixir) lib/kernel.ex:3556: Kernel.assert_module_scope/3
(elixir) lib/kernel.ex:2816: Kernel.define/4
(elixir) expanding macro: Kernel.def/2
(elixir) iex:1: :elixir_compiler.__FILE__/2
如何在Elixir控制台中定义命名函数
这可能吗
我需要为Elixir控制台创建一个特殊的模块吗 简短的回答:你不能
答案很长:Elixir中的所有代码都存在于模块内,因为许多Elixir功能(如热代码交换)依赖于将模块作为代码容器。这就是为什么不能在模块外定义函数(没有可以添加它们的全局可变命名空间)。可以在iex中定义模块。复制和粘贴工作正常:
iex(1)> defmodule Expand do
...(1)> def transform(myvar) do
...(1)> 8 * myvar + 3;
...(1)> end
...(1)> end
iex(2)> Expand.transform(12)
99
iex(3)> defmodule Expand do
...(3)> def transform(myvar) do
...(3)> 3 * myvar + 5
...(3)> end
...(3)> end
iex:3: warning: redefining module Expand
iex(4)> Expand.transform(12)
41
可以为Elixir控制台添加一个模块来定义函数吗?是的,您可以简单地将
def
嵌套在defmodule
中,就像在exs文件中一样。或者如果您不想定义整个模块,您可以使用匿名函数:transform=fn(myvar)->8*myvar+3 end
然后transform。(5)