本着以下精神:
- C#的隐藏特性
- Java的隐藏特性
- ASP.NET 的隐藏特性
- Python的隐藏特性
- HTML的隐藏特性
- 和其他隐藏功能问题
每个 Erlang 开发者都应该知道的 Erlang 隐藏的特性是什么?
请每个答案一个隐藏的功能。
本着以下精神:
每个 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 中的魔法命令。完整列表在手册中,但我最常用的是:
参数化模块!来自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 编译的 beam 中获取源代码,这非常有用
{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。
最重要的是,由于文件和套接字是作为端口实现的,因此您可以向它们发送 iolist。无需展平或附加。
可以使用 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 表达式。
.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很好地描述了各种 Type 值可以是什么以及它们的作用。
与 {active, once} 或 {active, true} 设置一起,每个框架值将作为单个消息传递。
示例:数据包 http 模式大量用于iserve和数据包 fcgi 模式用于ifastcgi。我可以想象许多其他 http 服务器也使用数据包 http。
.erlang 可以在 shell 启动时预加载库并运行命令,您还可以通过在节点名称上执行 case 语句来为特定节点执行特定命令。
如果要在列表推导中执行多个表达式,可以使用块。例如:
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
可以定义自己的迭代器供 QLC 使用。例如,可以将来自 SQL 查询的结果集制成 QLC 表,从而受益于 QLC 查询的特性。
除了 mnesia 表之外,dets 和 ets 还具有 table/1,2 函数来为它们返回这样的“查询句柄”。
选择 Erlang 作为开发平台时,不是那么隐蔽,而是最重要的方面之一:
您可以通过以下方式隐藏 Erlang 节点:
erl -sname foo -hidden
您仍然可以连接到该节点,但它不会出现在nodes/0
.
与附加运算符匹配:
"pajamas:" ++ Color = "pajamas:blue"
颜色现在具有值“蓝色”。请注意,此技巧有其局限性 - 据我所知,它仅适用于上面给出的顺序的单个变量和单个常量。
热代码加载。来自维基。
代码作为“模块”单元加载和管理,模块是一个编译单元。系统可以同时在内存中保存一个模块的两个版本,并且进程可以同时运行每个版本的代码。
这些版本被称为“新”和“旧”版本。进程在对其模块进行外部调用之前不会进入新版本。