在以下的灵感中:
- 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.beam,您可以构建自己的 shell 内置程序,这非常方便。
beam_lib:chunks可以从启用调试信息的beam文件中获取源代码,这非常有用。
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
端口,无论是外部的还是链接进来的,都接受称为 io 列表的东西来将数据发送给它们。io 列表是二进制或者是一个(可能是深层嵌套的)二进制或整数列表(0 到 255 范围内)。
这意味着与其在发送给端口之前将两个列表拼接在一起,我们只需将它们作为列表中的两个项直接发送即可。因此,与其这样:
"foo" ++ "bar"
一次操作
["foo", "bar"]
可以使用ets:fun2ms(...)来构建符合规格的匹配,其中使用Erlang函数语法,并将其转换为具有解析变换的匹配规范。
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
因此,没有fun-value被建立,表达式在编译时被替换为匹配规范。函数只能执行与匹配表达式相同的操作。
此外,在shell中可以使用ets:fun2ms轻松测试函数表达式。
.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"