以下の精神で:
- C# の隠れた機能
- Java の隠れた機能
- ASP.NET の隠れた機能
- Python の隠れた機能
- HTML の隠れた機能
- その他の隠し機能に関する質問
すべての Erlang 開発者が知っておくべき Erlang の隠れた機能は何ですか?
回答ごとに 1 つの隠し機能をお願いします。
以下の精神で:
すべての Erlang 開発者が知っておくべき Erlang の隠れた機能は何ですか?
回答ごとに 1 つの隠し機能をお願いします。
継承!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
シェルの魔法のコマンド。完全なリストはマニュアルにありますが、私が最も使用するものは次のとおりです。
パラメータ化されたモジュール!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をパスに含めることで、独自のシェルビルトインを構築できます。
beam_lib:chunksは、デバッグでコンパイルされたビームからソースコードを取得できます。これは、非常に便利です。
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
外部またはリンクされたポートは、データを送信するために io-list と呼ばれるものを受け入れます。io-list は、0..255 の範囲のバイナリまたは (場合によっては深い) バイナリまたは整数のリストです。
これは、ポートに送信する前に 2 つのリストを連結するのではなく、リスト内の 2 つの項目として送信できることを意味します。だから代わりに
"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 の fun 構文が使用され、解析変換を使用して一致仕様に変換されます。
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
したがって、fun-value は構築されず、式はコンパイル時に match-spec に置き換えられます。fun は、match 式で実行できることしか実行できません。
また、ets:fun2ms をシェルで使用できるので、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"
.erlangは、シェルの起動時にライブラリをプリロードしてコマンドを実行できます。また、ノード名に対してcaseステートメントを実行することにより、特定のノードに対して特定のコマンドを実行することもできます。
リスト内包表記で複数の式を実行する場合は、ブロックを使用できます。例えば:
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
隠されているわけではありませんが、Erlang を開発プラットフォームとして選択する際の最も重要な側面の 1 つです。
次のように開始することで、Erlang ノードを非表示にすることができます。
erl -sname foo -hidden
ノードに接続することはできますが、 によって返されるリストには表示されませんnodes/0
。
追加演算子とのマッチング:
"pajamas:" ++ Color = "pajamas:blue"
色の値は「青」になりました。このトリックには制限があることに注意してください。私の知る限り、上記の順序で単一の変数と単一の定数でのみ機能します。
ホットコードの読み込み。ウィキより。
コードは「モジュール」単位としてロードおよび管理されます。モジュールはコンパイル単位です。システムはモジュールの 2 つのバージョンを同時にメモリに保持でき、プロセスはそれぞれのコードを同時に実行できます。
バージョンは「新」および「旧」バージョンと呼ばれます。プロセスは、そのモジュールへの外部呼び出しを行うまで、新しいバージョンに移行しません。