当前位置:  开发笔记 > 编程语言 > 正文

Erlang的隐藏功能

如何解决《Erlang的隐藏功能》经验,为你挑选了10个好方法。

本着:

C#的隐藏功能

Java的隐藏功能

ASP.NET的隐藏功能

Python的隐藏功能

HTML的隐藏功能

和其他隐藏的功能问题

每个Erlang开发人员都应该注意Erlang的隐藏功能是什么?

请回答一个隐藏的功能.



1> bjnortier..:

遗产!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



2> legoscia..:

shell中的魔术命令.完整列表在手册中,但我最常用的是:

f() - 忘记所有变量

f(X) - 忘记X.

v(42) - 从第42行回忆结果

v(-1) - 从上一行调用结果

e(-1) - 在前一行重新执行表达式

rr(foo) - 从模块foo读取记录定义

rr("*/*") - 从每个子目录中的每个模块读取记录定义

rp(表达式) - 使用记录格式打印完整表达式


并使用rp(表达式(...))打印出结果,而不会打印太深的嵌套结构,而是将其完全打印出来

3> bjnortier..:

参数化模块!来自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



4> 小智..:

user_default.erl - 您可以通过在路径中编译user_default.beam来构建自己的shell内置函数,这可能非常漂亮



5> 小智..:

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))]).



6> Christian..:

端口,外部或链接,接受称为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.无需展平或追加.



7> Christian..:

可以使用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.



8> 小智..:

.erlang_hosts提供了一种跨机器共享名称的好方法



9> bjnortier..:

不一定"隐藏",但我不经常看到这一点.匿名函数可以有多个子句,就像模块函数一样

-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"



10> Christian..:

gen___tcp和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议.函数erlang:decode_packet/3可以很好地描述各种类型值的含义以及它们的作用.

与{active,once}或{active,true}设置一起,每个框架值将作为单个消息传递.

示例:数据包http模式主要用于isveve,数据包fcgi模式用于ifastcgi.我可以想象许多其他的http服务器也使用数据包http.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有