pag*_*man 17 erlang hidden-features
本着:
每个Erlang开发人员都应该注意Erlang的隐藏功能是什么?
请回答一个隐藏的功能.
bjn*_*ier 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", []).
Run Code Online (Sandbox Code Playgroud)
儿童
-module(child).
-extends(parent).
-export([foo/0]).
foo() ->
io:format("child:foo/0 ~n", []).
Run Code Online (Sandbox Code Playgroud)
安慰
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
Run Code Online (Sandbox Code Playgroud)
bjn*_*ier 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.
Run Code Online (Sandbox Code Playgroud)
和
Eshell V5.6 (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234
Run Code Online (Sandbox Code Playgroud)
小智 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))]).
Run Code Online (Sandbox Code Playgroud)
端口,外部或链接,接受称为io-lists的东西,用于向它们发送数据.io-list是二进制或(可能深)的二进制或整数列表,范围为0..255.
这意味着,不是在将两个列表发送到端口之前连接两个列表,而是可以将它们作为列表中的两个项目发送.而不是
"foo" ++ "bar"
Run Code Online (Sandbox Code Playgroud)
一个人
["foo", "bar"]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,它当然具有微小的差异.但是,在创建输出数据时,iolist本身允许方便的编程.io_lib:format/2,3本身返回一个io列表.
函数erlang:list_to_binary/1接受io列表,但现在我们有了erlang:iolist_to_binary/1,它更好地传达了意图.还有一个erlang:iolist_size/1.
最重要的是,由于文件和套接字是作为端口实现的,因此您可以向它们发送iolists.无需展平或追加.
可以使用ets:fun2ms(...)构建匹配规范,其中使用Erlang fun语法并将其转换为具有解析变换的匹配规范.
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
Run Code Online (Sandbox Code Playgroud)
所以没有构建任何有趣的值,表达式在编译时被match-spec替换.这种乐趣可能只会做匹配表达式可以做的事情.
另外,ets:fun2ms可以在shell中使用,因此可以轻松测试fun-expression.
不一定"隐藏",但我不经常看到这一点.匿名函数可以有多个子句,就像模块函数一样
-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"
Run Code Online (Sandbox Code Playgroud)
gen___tcp和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议.函数erlang:decode_packet/3可以很好地描述各种类型值的含义以及它们的作用.
与{active,once}或{active,true}设置一起,每个框架值将作为单个消息传递.
示例:数据包http模式主要用于isveve,数据包fcgi模式用于ifastcgi.我可以想象许多其他的http服务器也使用数据包http.