3

我正在研究一个问题的解决方案,这需要更改 module 的功能之一gb_trees

我在编译以下的编辑版本时遇到错误gb_trees

1> c(gb_trees).
cannot write to .bea#
...
2>

我可以通过什么方式进行更改和编译已经存在的模块?

4

1 回答 1

7

可能您的文件正在被另一个进程使用。关闭您正在使用的所有应用程序或重新启动操作系统,然后尝试重新编译。

您正在尝试手动加载模块,它是 Erlang/OTP 的一部分。

从文档:

Erlang 运行时系统正在保护您。

最简单的解决方案是重命名您的模块,例如重命名为 mysets.erl。也可以“取消粘贴”包含库模块的目录。

code:unstick/1

还:

为了防止意外重新加载影响 Erlang 运行时系统本身的模块kernelstdlibcompiler目录被认为是 粘性的。这意味着如果用户尝试重新加载驻留在其中任何一个中的模块,系统会发出警告并拒绝请求。可以使用命令行标志禁用该功能-nostick

erl(1)

例如:

$ erl -nostick
Eshell V5.7.3  (abort with ^G)
1> c(gb_trees).
{ok,gb_trees}
2> gb_trees:module_info().
[{exports,[{foo,2},{module_info,0},{module_info,1}]},
 {imports,[]},
 {attributes,[{vsn,[338095567601101424197378397768992511838]}]},
 {compile,[{options,[]},
           {version,"4.6.3"},
           {time,{2011,2,3,11,39,53}},
           {source,"/tmp/gb_trees.erl"}]}]
3>

您会看到我们可以编译模块并将其加载到 VM 中。

但是,您可以将模块重命名gb_trees为类似的gb_trees_mine名称并使用它导出的函数:

1> gb_trees_mine:foo(13,42).
bar
2>
于 2011-02-03T11:19:11.463 回答