17

本着以下精神:

  • C#的隐藏特性
  • Java的隐藏特性
  • ASP.NET 的隐藏特性
  • Python的隐藏特性
  • HTML的隐藏特性
  • 和其他隐藏功能问题

每个 Erlang 开发者都应该知道的 Erlang 隐藏的特性是什么?

请每个答案一个隐藏的功能。

4

17 回答 17

25

遗产!http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

家长

-module(parent).
-export([foo/0, bar/0]).

foo() ->
    io:format("parent:foo/0 ~n", []).

bar() ->
    io:format("parent:bar/0 ~n", []).

孩子

-module(child).
-extends(parent).
-export([foo/0]).

foo() ->
    io:format("child:foo/0 ~n", []).

安慰

23> parent:foo().
parent:foo/0 
ok
24> parent:bar().
parent:bar/0 
ok
25> child:foo().
child:foo/0 
ok
26> child:bar().
parent:bar/0 
ok
于 2009-07-06T12:07:51.223 回答
19

shell 中的魔法命令。完整列表在手册中,但我最常用的是:

  • f() - 忘记所有变量
  • f(X) - 忘记 X
  • v(42) - 第 42 行的召回结果
  • v(-1) - 上一行的召回结果
  • e(-1) - 重新执行上一行的表达式
  • rr(foo) - 从模块 foo 读取记录定义
  • rr("*/*") - 从每个子目录中的每个模块读取记录定义
  • rp(表达式) - 打印带有记录格式的完整表达式
于 2009-06-30T15:49:25.250 回答
14

参数化模块!来自http://www.lshift.net/blog/2008/05/18/late-binding-with-erlanghttp://www.erlang.se/euc/07/papers/1700Carlsson.pdf

-module(myclass, [Instvar1, Instvar2]).
-export([getInstvar1/0, getInstvar2/0]).
getInstvar1() -> Instvar1.
getInstvar2() -> Instvar2.

Eshell V5.6  (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234
于 2009-07-06T12:13:24.803 回答
12

user_default.erl - 你可以通过在你的路径中编译 user_default.beam 来构建你自己的 shell 内置函数,这可能非常漂亮

于 2009-07-01T13:33:34.080 回答
10

beam_lib:chunks 可以从使用 debug 编译的 beam 中获取源代码,这非常有用

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
  io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
于 2009-07-01T13:35:34.450 回答
9

端口,外部的或链接的,接受称为 io-lists 的东西来向它们发送数据。io-list 是 0..255 范围内的二进制或整数的二进制或(可能很深)列表。

这意味着,与其在将两个列表发送到端口之前将它们连接起来,不如将它们作为列表中的两个项目发送。所以而不是

"foo" ++ "bar"

一个做

["foo", "bar"]

在这个例子中,当然是微乎其微的差异。但是 iolist 本身允许在创建输出数据时进行方便的编程。例如,io_lib:format/2,3 本身返回一个 io 列表。

函数 erlang:list_to_binary/1 接受 io 列表,但现在我们有 erlang:iolist_to_binary/1 可以更好地传达意图。还有一个 erlang:iolist_size/1。

最重要的是,由于文件和套接字是作为端口实现的,因此您可以向它们发送 iolist。无需展平或附加。

于 2009-07-23T08:09:32.970 回答
8

可以使用 ets:fun2ms(...) 构建匹配规范,其中使用 Erlang 有趣的语法并将其转换为具有解析转换的匹配规范。

1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]

因此没有构建任何有趣的值,表达式在编译时被匹配规范替换。乐趣可能只做匹配表达式可以做的事情。

此外, ets:fun2ms 可在 shell 中使用,因此可以轻松测试 fun 表达式。

于 2009-07-23T07:04:51.540 回答
7

.erlang_hosts 提供了一种跨机器共享名称的好方法

于 2009-07-01T13:35:06.760 回答
6

不一定“隐藏”,但我不经常看到这一点。匿名函数可以有多个子句,就像模块函数一样,即

-module(foo).
-compile(export_all).

foo(0) -> "zero";
foo(1) -> "one";
foo(_) -> "many".

anon() ->
    fun(0) ->
            "zero";
       (1) ->
            "one";
       (_) ->
            "many"
    end.


1> foo:foo(0).
"zero"
2> foo:foo(1).
"one"
3> foo:foo(2).
"many"

4> (foo:anon())(0).
"zero"
5> (foo:anon())(1).
"one"
6> (foo:anon())(2).
"many"
于 2010-08-20T12:39:26.977 回答
5

gen___tcp 和 ssl 套接字有一个 {packet, Type} 套接字选项来帮助解码许多协议。函数erlang:decode_packet/3很好地描述了各种 Type 值可以是什么以及它们的作用。

与 {active, once} 或 {active, true} 设置一起,每个框架值将作为单个消息传递。

示例:数据包 http 模式大量用于iserve和数据包 fcgi 模式用于ifastcgi。我可以想象许多其他 http 服务器也使用数据包 http。

于 2009-07-23T07:29:30.943 回答
4

.erlang 可以在 shell 启动时预加载库并运行命令,您还可以通过在节点名称上执行 case 语句来为特定节点执行特定命令。

于 2009-07-01T13:34:53.297 回答
3

如果要在列表推导中执行多个表达式,可以使用块。例如:

> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
于 2011-02-28T11:17:02.140 回答
2

可以定义自己的迭代器供 QLC 使用。例如,可以将来自 SQL 查询的结果集制成 QLC 表,从而受益于 QLC 查询的特性。

除了 mnesia 表之外,dets 和 ets 还具有 table/1,2 函数来为它们返回这样的“查询句柄”。

于 2009-07-23T07:36:57.340 回答
2

选择 Erlang 作为开发平台时,不是那么隐蔽,而是最重要的方面之一:

  • 在活动节点(服务中)上增强跟踪的可能性,并成为最好的调试之一!
于 2010-05-16T00:50:08.270 回答
2

您可以通过以下方式隐藏 Erlang 节点

erl -sname foo -hidden

您仍然可以连接到该节点,但它不会出现在nodes/0.

于 2010-07-12T12:04:39.067 回答
2

与附加运算符匹配:

"pajamas:" ++ Color = "pajamas:blue"

颜色现在具有值“蓝色”。请注意,此技巧有其局限性 - 据我所知,它仅适用于上面给出的顺序的单个变量和单个常量。

于 2011-02-26T23:06:26.223 回答
1

热代码加载。来自维基。

代码作为“模块”单元加载和管理,模块是一个编译单元。系统可以同时在内存中保存一个模块的两个版本,并且进程可以同时运行每个版本的代码。

这些版本被称为“新”和“旧”版本。进程在对其模块进行外部调用之前不会进入新版本。

于 2009-06-30T12:53:51.357 回答