本着以下精神:
每个Erlang开发人员都应该注意Erlang的隐藏功能是什么?
请回答每个答案的一个隐藏功能。
答案 0 :(得分: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
答案 1 :(得分:19)
shell中的魔术命令。完整列表位于the manual,但我最常用的是:
答案 2 :(得分:14)
参数化模块!来自http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang和http://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
答案 3 :(得分:12)
user_default.erl - 您可以通过在路径中编译user_default.beam来构建自己的shell内置版,这可能非常漂亮
答案 4 :(得分:10)
beam_lib:chunks可以从使用debug编译的波束中获取源代码,这可能非常有用
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
答案 5 :(得分: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.
最重要的,因为文件和套接字是作为端口实现的,所以您可以向它们发送iolists。无需展平或追加。
答案 6 :(得分:8)
可以使用ets:fun2ms(...)构建匹配规范,其中使用Erlang fun语法并将其转换为带有解析变换的匹配规范。
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
所以没有构建任何有趣的值,表达式在编译时被match-spec替换。这种乐趣可能只会做匹配表达式所能做的事情。
另外,ets:fun2ms可以在shell中使用,因此可以轻松测试fun-expression。
答案 7 :(得分:7)
.erlang_hosts提供了一种跨机器共享名称的好方法
答案 8 :(得分: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"
答案 9 :(得分:5)
gen___tcp和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议。函数erlang:decode_packet/3可以很好地描述各种类型值的含义以及它们的作用。
与{active,once}或{active,true}设置一起,每个框架值将作为单个消息传递。
示例:数据包http模式大量用于iserve,数据包fcgi模式用于ifastcgi。我可以想象许多其他的http服务器也使用数据包http。
答案 10 :(得分:4)
.erlang可以在shell启动时预加载库并运行命令,也可以通过对节点名称执行case语句来为特定节点执行特定命令。
答案 11 :(得分:3)
如果要在列表推导中执行多个表达式,可以使用块。例如:
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
答案 12 :(得分:2)
可以为QLC定义自己的迭代器以供使用。例如,可以将SQL查询的结果集制作成QLC表,从而受益于QLC查询的功能。
除了mnesia表,dets和ets还有table / 1,2函数来为它们返回这样的“查询句柄”。
答案 13 :(得分:2)
当选择Erlang作为开发平台时,不是那么隐藏,而是最重要的方面之一:
答案 14 :(得分:2)
您可以隐藏Erlang节点,方法是:
erl -sname foo -hidden
您仍然可以连接到该节点,但它不会出现在nodes/0
返回的列表中。
答案 15 :(得分:2)
与追加运算符匹配:
"pajamas:" ++ Color = "pajamas:blue"
现在颜色的值为“蓝色”。请注意,这个技巧有它的局限性 - 据我所知,它只能按照上面给出的顺序使用单个变量和一个常量。
答案 16 :(得分:1)
Hot code loading.来自维基。
代码作为“模块”单元加载和管理,模块是编译单元。系统可以同时在内存中保留两个版本的模块,并且进程可以同时运行每个版本的代码。
版本被称为“新”和“旧”版本。在对其模块进行外部调用之前,进程不会进入新版本。