首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Elixir控制台中定义命名函数而不得到** (ArgumentError)无法在模块外部调用def/2?

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

Stack Overflow用户
提问于 2015-02-11 06:24:21
回答 2查看 10.8K关注 0票数 25

我可以很好地在模块中定义命名函数,但是我还没有掌握在iex>或ex>控制台中使用它的诀窍。

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

代码语言:javascript
复制
(ArgumentError) cannot invoke def/2 outside module

pprime.exs

代码语言:javascript
复制
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很好地运行它,如下所示:

代码语言:javascript
复制
$ elixir pprime.exs

然而,在控制台中,我似乎不能做任何这样的事情:

代码语言:javascript
复制
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控制台中使用的特殊模块吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 06:29:23

简短的回答是:你不能。

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

票数 25
EN

Stack Overflow用户

发布于 2015-02-11 11:00:17

您可以在iex中定义该模块。复制和粘贴可以很好地工作:

代码语言:javascript
复制
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
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28443053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档