Erlang的隐藏特征
本着以下精神:Erlang的隐藏特征,erlang,hidden-features,Erlang,Hidden Features,本着以下精神: C语言的隐藏特征# Java的隐藏特性 ASP.NET的隐藏特性 Python的隐藏特性 HTML的隐藏特性 和其他隐藏的功能问题 每个Erlang开发人员都应该知道Erlang的哪些隐藏特性 请为每个答案提供一个隐藏功能。来自wiki 代码作为“模块”单元加载和管理,模块是一个编译单元。系统可以在内存中同时保存一个模块的两个版本,进程可以同时运行每个版本的代码 这些版本指的是“新”和“旧”版本。在对其模块进行外部调用之前,进程不会移动到新版本中 魔法在贝壳里发出指令。完整列
- C语言的隐藏特征#
- Java的隐藏特性
- ASP.NET的隐藏特性
- Python的隐藏特性
- HTML的隐藏特性
- 和其他隐藏的功能问题
魔法在贝壳里发出指令。完整列表在中,但我使用最多的是:
- f()-忘记所有变量
- f(X)-忘记X
- v(42)-第42行的召回结果
- v(-1)-上一行的召回结果
- e(-1)-在前一行上重新执行表达式
- rr(foo)-从模块foo读取记录定义
- rr(“*/*”)-从每个子目录中的每个模块读取记录定义
- rp(表达式)-使用记录格式打印完整表达式
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
继承权
母公司
-module(parent).
-export([foo/0, bar/0]).
foo() ->
io:format("parent:foo/0 ~n", []).
bar() ->
io:format("parent:bar/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
参数化模块!从和 及
可以使用ets:fun2ms(…)构建匹配规范,其中使用Erlang-fun语法并通过解析转换转换为匹配规范
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
因此,不会生成有趣的值,表达式在编译时会替换为匹配规范。乐趣可能只会做匹配表达式所能做的事情
此外,ets:fun2ms可在shell中使用,因此可以轻松测试有趣的表达式。gen_uuuuuTCP和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议。函数很好地描述了各种类型值可以是什么以及它们的作用 与{active,once}或{active,true}设置一起,每个帧值将作为单个消息传递
示例:数据包http模式主要用于,数据包fcgi模式主要用于。我可以想象许多其他http服务器也使用数据包http。可以为QLC定义自己的迭代器。例如,可以将SQL查询的结果集生成QLC表,从而受益于QLC查询的功能
除了mnesia表,DET和ets还具有表/1,2功能,可以为它们返回这样一个“查询句柄”。外部或链接入的端口接受称为io列表的内容,以便向它们发送数据。io列表是范围为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。无需扁平化或附加。选择Erlang作为开发平台时,不需要隐藏,而是最重要的一个方面:
- 在活动节点(服务中)上增强跟踪的可能性,并且是调试中最好的之一李>
erl -sname foo -hidden
您仍然可以连接到节点,但它不会出现在节点/0
返回的列表中,也不一定是“隐藏的”,但我不经常看到这种情况。匿名函数可以有多个子句,就像模块函数一样,例如
-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"
与追加运算符匹配: 睡衣:++Color=“睡衣:蓝色”
颜色现在的值为“蓝色”。请注意,此技巧有其局限性-据我所知,它仅适用于按上述顺序排列的单个变量和单个常量。如果要在列表中执行多个表达式,可以使用块。例如:
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
[开始erlang:显示(N),N*10 end | | N请访问社区维基。我建议在此添加一个隐藏功能标签,并在其他语言的隐藏功能上做笔记,链接到这些问题。@Olafur how?help!@Avihu done。感谢您的建议!:)这是一个隐藏功能吗?这当然是一个值得注意的功能,但这是该语言最主要的炫耀之一点,一点也不隐藏。但为什么他妈的没有更新投票呢?:我在尝试搜索mochiweb源代码时发现了这一点。我花了一段时间去谷歌它到底在做什么,因为它的语法与我以前见过的Erlang完全不同。这很有趣!我还在mochiweb上第一次看到它。将它与继承相结合可能会产生一些有趣的可能性…如果你想知道否决票,这是一个意外,请检查。我将编辑你的问题,以便它们可以被删除。并使用rp(表达式(…)打印结果,而不必进行漂亮的打印
erl -sname foo -hidden
-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"
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]