我想((IStringer)object).ToString()
用 Erlang 写类似(在 C# 中)的东西。经过一些研究,我了解到 Elixir 有一个叫做 Protocols 的东西,它与 C# 非常相似(以由内而外的方式)。然后我在 Erlang 中提出了这个想法/代码——这对我来说已经足够好了:
?stringer(my_val):to_string().
它要么返回预期值,要么返回not_implemented
原子!
但是有2个问题:
1 - 为什么没有人使用这个或基于 Erlang 中的有状态模块来推广东西?(OTP 除了与一些 Erlangers 交谈之外,他们不知道 OTP 实际上是围绕此构建的!所以确实需要改变 Erlang 的教学和推广方式。我可能很困惑。)。
2 - 为什么我会收到此警告?这个电话实际上永远不会失败。
警告:
stringer.erl:18: Warning: invalid module and/or function name; this call will always fail
stringer.erl:19: Warning: invalid module and/or function name; this call will always fail
stringer.erl:20: Warning: invalid module and/or function name; this call will always fail
编码:
-module(stringer).
-export([to_string/1,sample/0]).
-define(stringer(V), {stringer, V}).
to_string({stringer, V}) when is_list(V) ->
to_string(V, nop);
to_string({stringer, V}) when is_atom(V) ->
to_string(V, nop);
to_string({stringer, _V}) ->
not_implemented.
to_string(V, _Nop) ->
Buffer = io_lib:format("~p",[V]),
lists:flatten(Buffer).
sample() ->
io:format("~p~n", [?stringer([1,2]):to_string()]),
io:format("~p~n", [?stringer(cute_atom):to_string()]),
io:format("~p~n", [?stringer(13):to_string()]).
输出是:
"[1,2]"
"cute_atom"
not_implemented
我在 Windows 8 64 位上的 Erlang R16 B2 (V5.10.3) 32 位上执行此操作。