热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Elixir控制台中定义命名函数而不得**(ArgumentError)无法调用def/2外部模块?》经验,为你挑选了2个好方法。

我可以很好地在模块中定义命名函数,但我还没有把它用在iex>或ex>控制台中.

当我尝试运行def命令时,我不断收到以下错误:

(ArgumentError) cannot invoke def/2 outside module

pprime.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运行这个,如下:

$ 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控制台中使用?



1> José Valim..:

简答:你做不到.

答案很长:Elixir中的所有代码都存在于模块内部,因为许多Elixir功能(如热代码交换)依赖于将模块作为代码容器.这就是为什么你不能在模块外定义函数(没有可以添加的全局,可变命名空间).


是的,您可以简单地将`def`嵌套在`defmodule`中,就像在exs文件中一样.

2> greggreg..:

您可以在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


或者如果你不想定义整个模块,你可以使用匿名函数:`transform = fn(myvar) - > 8*myvar + 3 end`然后`transform.(5)`
推荐阅读
author-avatar
mobiledu2502913173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有