本着:
C#的隐藏功能
Java的隐藏功能
ASP.NET的隐藏功能
Python的隐藏功能
HTML的隐藏功能
和其他隐藏的功能问题
每个Erlang开发人员都应该注意Erlang的隐藏功能是什么?
请回答一个隐藏的功能.
遗产!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
shell中的魔术命令.完整列表在手册中,但我最常用的是:
f() - 忘记所有变量
f(X) - 忘记X.
v(42) - 从第42行回忆结果
v(-1) - 从上一行调用结果
e(-1) - 在前一行重新执行表达式
rr(foo) - 从模块foo读取记录定义
rr("*/*") - 从每个子目录中的每个模块读取记录定义
rp(表达式) - 使用记录格式打印完整表达式
参数化模块!来自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
user_default.erl - 您可以通过在路径中编译user_default.beam来构建自己的shell内置函数,这可能非常漂亮
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))]).
端口,外部或链接,接受称为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.无需展平或追加.
可以使用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.
.erlang_hosts提供了一种跨机器共享名称的好方法
不一定"隐藏",但我不经常看到这一点.匿名函数可以有多个子句,就像模块函数一样
-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"
gen___tcp和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议.函数erlang:decode_packet/3可以很好地描述各种类型值的含义以及它们的作用.
与{active,once}或{active,true}设置一起,每个框架值将作为单个消息传递.
示例:数据包http模式主要用于isveve,数据包fcgi模式用于ifastcgi.我可以想象许多其他的http服务器也使用数据包http.