因此,当用户发送注册帐户的请求时,他们会发送用户名、密码、电子邮件和其他信息。注册函数必须验证它们的所有数据。一个例子是:
alphanumeric
所有字段均在X字符长
F 211
现在我不想有一个5级深度的if或case语句,但我还有其他选择吗?将它分割成单独的函数听起来是个不错的主意,但是我只需要在某种条件下检查函数的返回值,它就回到了原来的问题上。
我可以将它们分解成函数,然后调用一个if语句,其中包含所有的条件或条件,但这不能满足我的需要,因为我需要能够告诉用户具体的错误(如果有)。
在二郎如何处理这种情况?是否有一个等价的返回语句,或者它必须是函数中的最后一个可执行行才能成为返回值?
发布于 2019-07-13 04:59:59
基于@JLarky的回答,下面是我想出的一些东西。它也从哈斯克尔的单曲中得到了一些启示。
-record(user,
{name :: binary(),
email :: binary(),
password :: binary()}
).
-type user() :: #user{}.
-type bind_res() :: {ok, term()} | {error, term()} | term().
-type bind_fun() :: fun((term()) -> bind_res()).
-spec validate(term(), [bind_fun()]) -> bind_res().
validate(Init, Functions) ->
lists:foldl(fun '|>'/2, Init, Functions).
-spec '|>'(bind_fun(), bind_res())-> bind_res().
'|>'(F, {ok, Result}) -> F(Result);
'|>'(F, {error, What} = Error) -> Error;
'|>'(F, Result) -> F(Result).
-spec validate_email(user()) -> {ok, user()} | {error, term()}.
validate_email(#user{email = Email}) ->
...
-spec validate_username(user()) -> {ok, user()} | {error, term()}.
validate_username(#user{name = Name}) ->
...
-spec validate_password(user()) -> {ok, user()} | {error, term()}.
validate_password(#user{password = Password}) ->
...
validate(#user{...}, [
fun validate_email/1,
fun validate_username/1,
fun validate_password/1
]).发布于 2013-05-05 07:47:59
也许你需要使用
receive
message1 -> code1;
message2 -> code2;
...
end.但是,当然会有生成()方法。
https://stackoverflow.com/questions/666111
复制相似问题