Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Elixir控制台中定义命名函数而不获取**(ArgumentError)无法在模块外部调用def/2?_Elixir_Named - Fatal编程技术网

如何在Elixir控制台中定义命名函数而不获取**(ArgumentError)无法在模块外部调用def/2?

如何在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

我可以在模块中定义命名函数,但我还没有掌握在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

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)